计算子串的数量

时间:2011-06-19 11:33:54

标签: algorithm pattern-matching

我想问一下,是否存在一种算法,用于在O(n)时间内计算字符串中子字符串的离散出现次数。

2 个答案:

答案 0 :(得分:9)

[编辑17/11/2013:计算 leaf 节点。谢谢Vinicius Pinto!]

您可以在线性时间内在文本上构建suffix tree。然后,在后缀树中搜索您的子字符串;找到它时,计算匹配节点下面的叶节点数。这是长度为m的子串的O(m + k),出现k次(添加n个术语用于构建后缀树)。或者,您可以使用深度优先遍历来预先计算树中每个节点的后代数 - 这将提供O(m)查询。

对于大型文本,后缀数组在实践中通常比后缀树快,尽管搜索从O(m)到O(m log m)的单个长度为m的字符串。在这种情况下,特定子字符串的所有出现都将在后缀数组中显示为连续的块,因此该块的宽度是出现次数。

答案 1 :(得分:3)

您可以使用KMP Algorithm并修改它以增加计数器而不是返回。

另一种可能性是Rabin-Karp algorithm,但是这依赖于散列,所以你要么必须接受误报的可能性,同时保持复杂度线性,要么接受二次复杂度的可能性,同时保持结果100%正确