算法:查找保留顺序的两个字符串之间的所有常见子字符串

时间:2011-09-26 05:18:14

标签: algorithm diff sequence

想讨论算法,没有代码。

问题:让S和T成为两个元素序列。找到the order of the elements is preserved之间的公共子序列。

它应该具有O(n + m)运行时间,其中n是S的长度,m是T的长度。我还想假设大多数情况下两个序列将是相似的。

最佳解决方案?:经过一些研究,一个似乎最优的解决方案是首先为两个序列构建一个通用后缀树。然后找到longest common substring并将此子序列视为解决方案的一部分。然后从树中删除该子序列或者构建一个新的后缀树,从这两个原始序列中删除该子序列以形成S'和T'。然后找到S'和T'之间最长的公共子串,依此类推。

要分析运行时间,构建树需要O(n),你可以在O(n + m)中找到S和T最长公共子串的长度和起始位置。

是否有其他(更多)实用的解决方案,有人知道或可以链接到?任何已发表的论文都在考虑您都知道的相同或相关问题?对上述解决方案的投入和建设性批评?谢谢你所有的时间!

1 个答案:

答案 0 :(得分:1)

我的第一个想法是使用后缀树,并将其与LCS问题联系起来。但我不确定什么是更好的解决方案。我做了一个快速搜索,发现了一些可能有用的论文和项目,但没有保证。

http://dl.acm.org/citation.cfm?id=1625377(我相信直接链接:http://www.aaai.org/Papers/IJCAI/2007/IJCAI07-101.pdf

http://code.google.com/p/all-common-subsequences/

对不起,这是一个漫长的一天,我不太清醒,自己尝试更好的解决方案。