Haskell Text子字符串出现

时间:2015-02-02 12:05:13

标签: string haskell

我想查找给定字符串中子字符串的所有出现(索引)。 我的字符串是Data.Text.Text类型。我无法找到任何直接执行此操作的功能。有没有理由不提供它?我知道以下选项 -

  1. 我可以使用蛮力O(n ^ 2)方法
  2. 正则表达式
  3. 写我自己的Knuth Morris Pratt或Boyer-Moore 算法。
  4. Bytestring的文档显示不推荐使用findSubstrings。更重要的是,实现似乎是天真的模式匹配,它给出了O(n ^ 2)渐近性能。

    这让我很困惑。我们是说Haskell默认没有高效的字符串处理算法吗?

1 个答案:

答案 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