#include <stdio.h>
#include <string.h>
int f (int i,int j,char*x,int b[][20])
{
if (i==0 || j==0)
return;
if (b[i][j]==1)
{
f (i-1,j-1,x,b);
printf ("%c",x[i-1]);
}
else if (b[i][j]==2)
f(i-1,j,x,b);
else if (b[i][j]==3)
f(i,j-1,x,b);
}
void lcs(char*x,char*y,int m,int n,int c[][20],int b[][20])
{
int i,j;
for (i=0;i<=m;i++) c[i][0]=0;
for (j=0;j<=n;j++) c[0][j]=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; //数组b记录路径
}
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;
}
}
}
int main ()
{
int i,j;
int b[20][20];
int c[20][20];
int m,n;
char x[100],y[100];
gets(x);
gets(y);
m=strlen(x);
n=strlen(y);
lcs (x,y,m,n,c,b);
for (i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
printf ("%d ",b[i][j]);
printf ("\n");
}
f(m,n,x,b);
return 0;
}
最长公共子序列(动态规划)
最新推荐文章于 2024-08-12 21:49:42 发布