最长公共子序列

来源:互联网 发布:帝国cms自动采集发布 编辑:程序博客网 时间:2024/05/23 01:25

一个序列的子序列是该序列中删除某些元素后得到的序列。给定两个子序列X和Y,求二者的最长公共子序列。

例如,X={A,B,C,B,D,A,B},Y={B,D,C,A,B,A},则二者的最长公共子序列为BCBA,它的长度为4。

 

#include <stdio.h>void lcs(int m, int n,char *x,char *y,int **c,int **b){int i,j;for(i=1;i<m+1;i++)c[i][0]=0;for(i=1;i<n+1;i++) c[0][i]=0;for(i=1;i<m+1;i++){for(j=1;j<n+1;j++){if(x[i]==y[j]){c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}else{if(c[i-1][j]>c[i][j-1]){c[i][j]=c[i-1][j];b[i][j]=2;}else{c[i][j]=c[i][j-1];b[i][j]=3;}}}}}void out(int i, int j, char *x, int **b){if(i==0|| j==0) return;if(b[i][j]==1){out(i-1,j-1,x,b);printf("%c",x[i]);}else if(b[i][j]==2) out(i-1,j,x,b);else out(i,j-1,x,b);}int main(){char x[100], y[100];int m,n,i,**c,**b;scanf("%d %d",&m,&n);getchar();for(i=1;i<m+1;i++) scanf("%c",&x[i]);getchar();for(i=1;i<n+1;i++) scanf("%c",&y[i]);c=new int *[m+1];b=new int *[m+1];for(i=0;i<m+1;i++){c[i]=new int [n+1];b[i]=new int [n+1];}lcs(m,n,x,y,c,b); printf("%d\n",c[m][n]); out(m,n,x,b);putchar('\n');return 0;}

0 0
原创粉丝点击