对给出的两个序列X={x1,…,xm}和Y={y1,…,yn},找出X和Y的最长公共子序列z[]
#include <stdio.h>
#include <string.h>
int a[20][20];
int b[20][20];
char x[20];
char y[20];
char z[20];
int k=0;
void f(int m,int n,char x[20],char y[20],int a[20][20],int b[20][20])
{
//a[i][j]记录序列Xi和Yj的最长公共子序列的长度
//b[i][j]记录该位置的指向
int i,j;
for(i=1;i<=m;i++)
a[i][0]=0;
for(j=1;j<=n;j++)
a[0][j]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(x[i]==y[j])
{
a[i][j]=a[i-1][j-1]+1;
b[i][j]=2;
}
else if(a[i][j-1]>a[i-1][j])
{
a[i][j]=a[i][j-1];
b[i][j]=3;
}
else
{
a[i][j]=a[i-1][j];
b[i][j]=1;
}
}
}
void LCS(int i,int j,char x[20],int b[20][20])
{ //根据二维数组b找到所要求的最长公共子序列
if(i==0||j==0)
return ;
if(b[i][j]==2)
{
LCS(i-1,j-1,x,b);
printf("%c\n",x[i]);//z[k++]=x[i]将公共字符保持到字符数组z中
}
else if(b[i][j]==3)
{
LCS(i,j-1,x,b);
}
else
{
LCS(i-1,j,x,b);
}
}
void main()
{
strcpy(x," ABCBDAB");
strcpy(y," BDCABA");
printf("x的长度为:%d\n",strlen(x)-1);
printf("y的长度为:%d\n",strlen(y)-1);
f(7,6,x,y,a,b);
LCS(7,6,x,b);//x根据b求出与y的公共序列
}
运行:
x的长度为:7
y的长度为:6
B
C
B
A
Press any key to continue