一种采用了分治思想和动态规划的LCS算法,仅需O(NM)时间复杂度和O(min(N,M))空间复杂度就可得最大子串及其长度,具体参见论文:A Linear Space Algorithm for Computing Maximal Common Subsequences。这里介绍一下自己的理解。
如何分治?
给定两个字符串X(长度为m),Y(长度为n)。将X平分为两个子串X(1,m/2)和X(m/2+1,m),我们想在Y找到一个分割点j将Y切割为Y(1,j)和Y(j+1,n),使得LCS(X(1,m/2),Y(1,j))+LCS(X(m/2+1,m),Y(j+1,n))=LCS(X,Y)。
我们很容易看出,当LCS(X(1,m/2),Y(1,j))+LCS(X(m/2+1,m),Y(j+1,n))取得值最大时,j即为我们想找的切割点。
找到切割点之后我们就可以采用分治思想去推出子串。
具体算法参见论文: