我想查找给定字符串中子字符串的所有出现(索引)。 我的字符串是Data.Text.Text类型。我无法找到任何直接执行此操作的功能。有没有理由不提供它?我知道以下选项 -
Bytestring的文档显示不推荐使用findSubstrings。更重要的是,实现似乎是天真的模式匹配,它给出了O(n ^ 2)渐近性能。
这让我很困惑。我们是说Haskell默认没有高效的字符串处理算法吗?
答案 0 :(得分:1)
您可以使用具有O(n + m)渐近性能的breakOnAll。
module Main where
import Data.Text as T(map, length, pack, breakOnAll)
main = do
print $ subStrs "Grey Hound dig down" "ou"
print $ subStrInd "Grey Hound dig down" "ou"
print $ subStrs "abababababaaabbaba" "ab"
print $ subStrInd "abababababaaabbaba" "ab"
-- Return list of non-overlapping occurrences of sub in str
subStrs str sub = breakOnAll (pack sub) (pack str)
-- Return the indices of occurrences
subStrInd str sub = Prelude.map (\x -> T.length $ fst x) $ subStrs str sub
在不好的情况下,此函数的时间复杂度会降低到O(n * m)。
此外,您还需要已实施的算法,请查看https://hackage.haskell.org/package/KMP-0.1.0.2/docs/Data-Algorithms-KMP.html