后缀树(二进制字符串):查找最长的子字符串

时间:2011-06-20 10:36:53

标签: algorithm

寻找一种有效的算法来查找字符串中具有互补字符串的最长子字符串(按位)。

这就是我所说的互补字符串按位:

100011
011100

2 个答案:

答案 0 :(得分:1)

这是一个简单的O(n)算法,它依赖于后缀树构造。

将原始字符串s和补充字符串s'加载到相同的后缀树中(O(n)时间)。然后通过为每个节点x设置两个标志f(x)和f'(x)来对这个树进行后处理。当f(x)(resp.f'(x))包含后缀s时,这两个标志都是真的。 S')。现在只需遍历树,寻找同时设置了两个标志的最深节点,并找到s中最长的字符串,其补码也出现在s中。后处理也只花费O(n)时间,因此总运行时间为O(n)。

答案 1 :(得分:0)

以下算法是最差情况O(n * n),平均情况只是一点超线性。当有很多长公共子串时,它会遇到最坏的情况。

考虑可以通过从字符串中的任意点开始形成的子串集合。一旦只有一个可能的匹配,构建一个子串,这些子串以指向原始字符串中某个位置的指针结束。你必须为n个子字符串中的每个子字符串处理这个trie,但是你只需要通过字符串与其他字符串相关的最长公共子字符串来跟踪它。

一旦你构建了这个数据结构,就可以通过trie进行递归遍历,寻找将子字符串与其补码配对的方法。 trie的结构应该使这种配对非常有效,因为你只需要配对相反的子串,而不是它可能是字符串中所有其他位置的子串。

如果某些角色很常见而其补充不常见,则可以通过懒惰地构建角色来提高性能。