一、LCS定义
- 最长公共子序列(Longest Common Subsequence)
- 一个序列S任意删除若干个字符得到的新序列T,则T叫做S的子序列
- 两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序 列
- 字符串12455与245576的最长公共子序列为2455
- 字符串acdfg与adfc的最长公共子序列为adf
- 注意区别最长公共子串(Longest Common Substring)
- 最长公共子串要求连接
二、作用
- 求两个序列中最长的公共子序列算法
- 生物学家常利用该算法进行基因序列比对,以推测序列的结构、功能和演化过程。
- 描述两段文字之间的“相似度”
- 辨别抄袭,对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列 外的部分提取出来,该方法判断修改的部分。
三、求解(动态规划)
假设:字符串X,长度为m,从1开始数;字符串Y,长度为n,从1开始数;
▲ 如果xm = ym
对于上面的字符串X和Y:
x3 = y3=‘C’则有:LCS(BDC, ABC)=LCS(BD, AB)+‘C’
x5 = y4=‘B’则有:LCS(BDCAB, ABCB)=LCS(BDCA, ABC)+‘B’
▲ 如果xm ≠ yn
则LCS(X𝑚, Yn)=LCS(X𝑚−1, Yn)或者LCS(X𝑚, Yn)=LCS(X𝑚, Yn−1)
即LCS(X𝑚, Yn)=max{LCS(X𝑚−1, Yn), LCS(X𝑚, Yn−1)}
对于上面的字符串X和Y:
x2 ≠ y2则有:LCS(BD, AB)=max{LCS(BD, A), LCS(B, AB)}
x4 ≠ y5则有: LCS(BDCA, ABCBD)=max{LCS(BDCA, ABCB), LCS(