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



如果我想找到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字符串的最长公共前缀?[我不确定如何计算#的比较]

后缀数组允许我们用子字符串做更多的事情(比如搜索子字符串等),但是由于在这种情况下不需要其余的函数,DP会被认为是一种更容易/更干净的方法吗?在比较两个字符串的情况下,应该使用哪一个?

同样,如果我们有两个以上的字符串呢?

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

  1. 连接S1, S2,…, Sn如下:S = s1 $ 1s2 $2…$nSn,这里$i是不同的特殊符号(哨兵)
  2. 计算后缀数组。通常,我们在O(n*log n)内实现后缀数组,但有一个重要的算法叫做DC3,它在O(n)内计算后缀数组,n是n个字符串的总长度。你可以谷歌这个算法。
  3. 计算所有相邻后缀的LCP

最新更新