2/3字符串的最长公共子字符串:后缀数组与动态编程方法

时间:2013-03-14 14:25:17

标签: dynamic-programming suffix-array

如果我想找到2个字符串的最长公共子字符串,那么在时间/空间复杂度方面哪种方法会更有效:使用DP的后缀数组?

DP会产生O(m * n)空间,时间复杂度为O(m * n),后缀数组方法的时间复杂度是多少?

1)计算后缀O(m)+ O(n) 2)对它们进行排序O(m + n log2(m + n)) 3)找到m + n-1个字符串的最长公共前缀? [我不确定如何计算#ofcomparisons]

后缀数组允许我们使用子字符串执行更多操作(例如搜索子字符串等),但由于在这种情况下不需要其他函数,因此将DP视为更简单/更清晰的方法?在我们比较2个字符串的情况下应该使用哪一个?

另外,如果我们有超过2个字符串怎么办?

1 个答案:

答案 0 :(得分:0)

后缀数组会更好。 LCS(n个字符串的最长公共子字符串)问题可以解决如下:

  1. 连接S1,S2,...,Sn如下:      S = S1 $ 1S2 $ 2 ... $ nSn,这里$ i是不同的特殊符号(哨兵) 按字典顺序小于初始字母表中的其他符号。
  2. 计算后缀数组。通常,我们在O(n * log n)中实现了后缀数组,但是有一个名为DC3的重要算法,它在O(n)中计算后缀数组,n是N个字符串的总长度。你可以谷歌这个算法。
  3. 计算所有相邻后缀的LCP。