求解最长公共子序列问题
动态规划
//求解最长公共子序列问题
#include<stdio.h>
#include<string.h>
#define N 30
int lcslength(char *a,char *b,int c[][N]){ //求c[m][n] 即最长公共子序列的长度
int m = strlen(a),n = strlen(b);
int i,j;
for(i=0;i<=m;i++)
c[i][0] = 0;
for(i=0;i<=n;i++)
c[0][i] = 0;
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
if(a[i-1] == b[j-1])
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[m][n]; //c[m][n] 即为最长公共子序列的长度
}
char *buildcls(char *a,char *b){ //求a,b的最长公共子序列 即字符数组s[]
int k,i = strlen(a),j = strlen(b);
int c[N][N];
k = lcslength(a,b,c); //调用lcslength()函数,返回最长公共子序列的长度
static char s[N]; //s[]保存a,b的最长公共子序列
s[k] = '\0'; //0~k-1
while(k>0){
if(c[i][j] == c[i-1][j])
i--;
else if(c[i][j] == c[i][j-1])
j--;
else{
s[--k] = a[i-1]; // k = k-1 s[k-1] = a[i-1]
i--;
j--;
}
}
return s;
}
int main(){
char X[] = "abcbdb";
char Y[] = "acbbabdbb";
printf("X:%s\n",X);
printf("Y:%s\n",Y);
printf("X,Y的最长公共子序列为%s\n",buildcls(X,Y));
return 0;
}
浙公网安备 33010602011771号