在N个字符串中查找公共子字符串的算法

时间:2010-03-10 16:16:46

标签: algorithm string search

我熟悉2个字符串的LCS算法。寻找在2..N字符串中查找公共子串的建议。每对中可能有多个共同的子串。在字符串的子集中可以有不同的公共子串。

字符串:(ABCDEFGHIJKL) (DEF) (ABCDEF) (BIJKL) (FGH)

常用字符串:

1/2 (DEF)
1/3 (ABCDEF)
1/4 (IJKL)
1/5 (FGH)
2/3 (DEF)

最长的常用字符串:

1/3 (ABCDEF)

最常见的字符串:

1/2/3 (DEF)

2 个答案:

答案 0 :(得分:6)

这种事情一直在DNA序列分析中完成。您可以找到各种算法。列出了一个合理的集合here

还有蛮力的方法来制作每个子串的表(如果你只对短的子串感兴趣):形成一个N元树(字母N = 26,256为每个级别的ASCII),并在每个节点存储计数的直方图。如果你删除很少使用的节点(为了保持内存需求合理),你最终得到一个算法,它可以找到长度达到M的所有子序列,例如N * M ^ 2 * log(M)时间,用于输入长度N.如果您将其拆分为K个单独的字符串,则可以构建树结构,只需在树中一次性读取答案。

答案 1 :(得分:1)

后缀树是答案,除非你有一个很大的字符串,内存成为一个问题。期望字符串中每个字符有10~30个字节的内存使用量,以实现良好的实现。还有一些开源实现,这使您的工作更轻松。

还有其他更多的succint算法,但它们更难实现(寻找“压缩后缀树”)。