最长公共子序列(LCS)
子序列(subsequence): 一个特定序列的子序列就是将给定序列中零个或多个元素去掉后得到的结果(不改变元素间相对次序)。
给定的字符序列: {a,b,c,d,e,f,g,h},它的子序列示例: {a,c,e,f} 即元素b,d,g,h被去掉后,保持原有的元素序列所得到的结果就是子序列。同理,{a,h},{c,d,e}等都是它的子序列。
一个简单的例子
(以求ABCB和BDCA的LCS长度为例)
第一行和第一列初始化都为0
A和B不相等,所填值为左方和上方最大的那个
A和B不相等,所填值为左方和上方最大的那个
A和C不相等,所填值为左方和上方最大的那个
A和A相等,所填值为左上方的值+1
以此类推,得出结论
右下角的值即为LCS的长度
倒退回去LCS={B,C}
一个复杂的例子
以s1={1,3,4,5,6,7,7,8},s2={3,5,7,4,8,6,7,8,2}为例
然后,一行一行地从上往下填:
3和3相等,所填值为左上方的值+1;
第四行填入:
第五行填入:
第六行填入:
以此类推,得到结果:
可知LCS的长度为5
倒退回去可得:
LCS={3,4,6,7,8}
如果遇到S1[i] != S2[j] ,且c[i-1][j] = c[i][j-1] 这种存在分支的情况,选择另一个方向,会得到另一个结果。
LCS={3,5,7,7,8}