序列X = {x1,x2,x3...xm};
序列Y = {y1,y2,y3...yn};
求上述的两个序列LCS的长度。
分析:
如果 xm == yn 则 应该求Xm-1 和 Yn-1 的LCS的长度+1;
如果xm != yn 则 应该求解两个子问题
(1) Xm-1 和 Yn LCS的长度
(2) Xm 和 Yn-1 LCS的长度
则 上述 两个较长者 为所求的LCS 的长度;
定义C[i, j] 表示Xi 和 Yj 的LCS的长度 有如下公式(来自算法导论)
#include <stdio.h>
#include <string.h>
#define MAXLENGTH 100
// arrLen[i][j] 保存 X= {x1,x2...xi} 和 Y={y1,y2...yj} LCS的长度
// 与公式 c[i,j] 的意义同
int arrLen[MAXLENGTH][MAXLENGTH];
int getLCS(char *x,char *y);
int main(int argc, const char * argv[])
{
char *x = "abcbda";
char *y = "bdcaba";
int lcs = getLCS(x, y);
printf("LCS length is %d",lcs);
return 0;
}
int getLCS(char *x,char *y)
{
size_t m = strlen(x);
size_t n = strlen(y);
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (x[i-1] == y[j-1]) {
arrLen[i][j] = arrLen[i-1][j-1] + 1;
}else{
arrLen[i][j] = arrLen[i-1][j] > arrLen[i][j-1] ? arrLen[i-1][j] : arrLen[i][j-1];
}
}
}
return arrLen[m][n];
}