最长公共子序列
问题描述:
字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。
分析:
设x=(x1,x2,...,xn)和y=(y1,y2,...,yn)为两个子序列,并设z=(z1,z2,...,zk)为x和y的任意一个最长公共子序列。
1)如果x[m]=y[n],那么z[k]=x[m]=y[n],而且z[k-1]是x[m-1]和y[n-1]的最长公共子序列(LCS);
2)如果x[m]!=y[n],那么z[k]!=x[m],蕴含z是x[m-1]和y[n]的一个LCS;
3)如果x[m]!=y[n],那么z[k]!=y[n],蕴含z是x[m]和y[n-1]的一个LCS;
![](http://hi.csdn.net/attachment/201110/18/0_1318940524q1HR.gif)
lcs_length(x, y){
m = length(x);
n = length(y);
int c[m,n] = new int[][];
for (i = 0; i < m; i ++)
c[i,0] = 0;
for (j = 0; j < n; j ++)
c[0, j] = 0;
for (i = 0; i < m; ++ i){
for (j = 0; j < n; ++ j){
if (x[i] = y[j])
c[i, j] = c[i-1][j-1] + 1;
else if c[i-1][j] > c[i][j-1]
c[i,j] = c[i-1][j];
else c[i,j] = c[i][j-1];
}
}
return c;
}