我想问一下,是否存在一种算法,用于在O(n)时间内计算字符串中子字符串的离散出现次数。
答案 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%正确