最长公共子序列的意思就是两个序列,有公共的部分,公共部分在这两个序列的位置上不一定相等,但序列的逻辑顺序是相等的
例如给定两个序列x[1..m]和y[1..n],找出一个(注,这里说的是一个而不是这个,也就是说可能有很多个)最长的公共序列,其中
x: A B C B D A B y: B D C A B A
则LCS(x,y) = BCBA .........此处LCS(x,y)是一种函数标识形式,但不是函数
枚举算法:
对x[1..m]中每一个子序列判断是否也是y[1..n]中的一个子序列
这个算法对于x的每一个子序列y需要O(n)来比较,而x有2m个子序列(注,可以当成一个长度为m的bit-vector即位向量来找出不同的子序列)
这个算法的最坏运行时间是O(n2m)
递归算法:
策略是考虑x,y的前缀
定义:c[i,j] = | LCS(x[1..i],y[1..j])| 则c[m,n] = | LCS(x,y)|
上面c[i,j]表示x[1..i],y[1..j]的最长公共序列的长度,c[m,n]表示x[1..m],y[1..n]的最长公共序列的长度
则递归公式:
证明:在x[i] = y[j]情况下,如下图: