用动态规划找到两个字符串的最长公共子序列

来源:互联网 发布:索尼平板电脑 知乎 编辑:程序博客网 时间:2024/05/22 00:19
//用动态规划找到两个字符串的最长公共子序列,程序好像还有点问题#include<stdio.h>#include<string.h>int printlcs(char b[10][10],char x[],int i,int j){if((i==0)||(j==0))return 0;if(b[i][j]=='1'){printf("%c",x[i]);i--;j--;printlcs(b,x,i,j);}if(b[i][j]=='2'){i--;        printlcs(b,x,i,j);}else{j--;printlcs(b,x,i,j);}return 0;}void main(){int i,j,c[10][10],m=0,n=0;char x[10],y[10],b[10][10];printf("输入第一个字符串的长度:\n");scanf("%d",&m);printf("输入第二个字符串的长度:\n");scanf("%d",&n);printf("输入第一个:\n");char ch=getchar();for(i=1;i<=m;i++){scanf("%c",&x[i]);}printf("输入第二个:\n");ch=getchar();    for(i=1;i<=n;i++){scanf("%c",&y[i]);}printf("第一个为:\n");for(i=1;i<=m;i++){printf("%c",x[i]);}printf("\n");printf("第二个为:\n");for(i=1;i<=n;i++){printf("%c",y[i]);}printf("\n");for(i=1;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(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';}}printf("最长公共子序列的长度为:%d\n",c[m][n]);printlcs(b,x,m,n);}