Haskell: подсчитывать инфиксы строки - PullRequest
0 голосов
/ 07 марта 2019

Я хочу посчитать, как часто строковое «яйцо» находится в данной строке. Я просто знаю, как считать символы

easter :: String -> Int
easter s = length $ filter (== 'e') s

Пример: easter "eggabcdefgegggzueggeggegg" -> 5

Заранее спасибо

Ответы [ 4 ]

4 голосов
/ 07 марта 2019

Взгляните на раздел Извлечение подсписков стандартной библиотеки Data.List.

Вы хотите создать функцию, которая просматривает каждую точку в строке (помните, String - это псевдоним типа для [Char]), чтобы увидеть, запускается ли она "egg".

Вот как я могу это сделать.

easter :: String -> Int
easter str = length $ filter (isPrefixOf "egg") (tails str)
3 голосов
/ 07 марта 2019

Без возможности перекрытия это так же просто, как

> let s="eggabcdefgegggzueggeggegg" in sum [1 | i <- tails s, take 3 i == "egg"]

5

tails в Data.List.

2 голосов
/ 07 марта 2019

Принимая во внимание, что String - это просто [Char], сопоставление с образцом простое.

easter :: String -> Int
easter [] = 0
easter ('e':'g':'g':rest) = 1 + easter rest
easter (x:xs) = easter xs

В пустой строке явно есть 0 вхождений "egg".

Если строка начинается с «egg», есть хотя бы 1 вхождение.Удалите его и проверьте остаток строки.

Если строка начинается с чего-либо еще, удалите первую букву и продолжайте.

1 голос
/ 07 марта 2019

Подсчет слов может быть довольно простым. Просто используйте реализацию Бойера Мура

import Data.Text.Internal.Search (indices)
import qualified Data.Text as T

easter :: String -> Int
easter = length . indices (T.pack "egg") . T.pack

Теперь самое интересное - написать алгоритм самостоятельно. Это отличное учебное упражнение, распространенное в классах алгоритмов. Попробуйте! Не пытайтесь использовать текст в первый раз, просто используйте строку, как вы уже были, и следуйте статье в Википедии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...