LCS问题描述
- 定义:最长公共子序列(Longest Common Subsequence),即定义两个序列X和Y,求X和Y的最长公共子序列(子序列:一个序列S任意删除若干个字符得到新序列T,则T叫做S的子序列)
- 例如:字符串13455与245576的最长公共子序列为455
- LCS的意义:LCS可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。
LCS解法的探索
- 暴力求解:穷举法
分析:假设字符串X,Y的长度分别为m,n,那么字符串X,Y对应的子序列分别为2^m和2^n个。如果任意两个子序列一一比较,穷举搜索法需要指数时间O(2^(m+n)),显然不可取。
动态规划算法求解
- 动态规划算法:动态规划一般也只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
动态规划算法分以下四个步骤
1.描述最优解的结构
2.递归定义最优解的值
3.按自底向上的方式计算最优解的值
4.由计算出的结果构造一个最优解利用动态规划求解LCS
- 不妨设字符串X,长度为m,从1开始数,字符串Y,长度为n,从1开始数
- 不妨记 Xi=(x1,⋯,xi)(1≤i≤m),Yj=(y1,⋯,yj) (1≤j≤n)
- 假设LCS(X , Y) 为字符串X和Y的最长公共子序列,即为Z=(z1,⋯,zk)
(1)若Xm = Yn(最后一个字符相同),则Xm与Yn的最长公共子序列Zk的最后一个字符必定为Xm(Yn)
Zk = Xm = Yn
LCS(Xm,Yn) = LCS(X(m-1),Y(n-1)) + Xm
即在Xm-1和Yn-1的最长公共子序列的基础上加上相等元素
举例:Xm = Yn
String | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
X | B | D | C | A | B | A | |
Y | A | B | C | B | D | A | B |
对于字符串字符串X,Y
X3 = Y3 = ‘C’,LCS(BDC,ABC)=LCS(BD,AB)+‘C’
X5 = Y4 = ‘B’,LCS(BDCAB,ABCB)=LCS(BDCA,ABC)+’B’
(2)若Xm ≠ Yn,则(1)LCS(Xm,Yn) = LCS(X(m-1),Y(n)),(2)LCS(Xm,Yn) = LCS(X(m),Y(n-1))
证明:令Zk = LCS(Xm,Yn);由于Xm ≠ Yn 则Zk ≠ Xm 与Zk ≠ Yn至少有一个必然成立,因为Zk ≠ Xm,则最长公共子序列Zk是Xm-1和Yn得到的,即Zk = LCS(X(m-1),Y(n))。同理可证若Zk ≠ Ym,Zk = LCS(X(m),Y(n-1))
即, 若Xm ≠ Yn,则LCS(Xm,Yn) = max{LCS(X(m-1),Y(n)), LCS(X(m),Y(n-1))}
举例:Xm ≠ Yn
String | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
X | B | D | C | A | B | A | |
Y | A | B | C | B | D | A | B |
对于字符串字符串X,Y
X2 ≠ Y2 ,LCS(BD,AB)=max{LCS(BD,A), LCS(B,AB)}
X4 = Y5 ,LCS(BDCA,ABCBD)=max{ LCS(BDCA,ABCB), LCS(BDC,ABCBD) }
LCS分析总结:
LCS(Xm,Yn)={
LCS(X(m−1),Y(