我有:
问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。
给定两个序列A和B,称序列Z是A和B的公共子序列,是指Z同是A和B的子序列。问题要求已知两序列A和B的最长公共子序列。
三、实验代码
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define Size 100
void LCSLength(int m,int n,char *x,char *y,int c[Size][Size],int b[Size][Size])
{ int i,j;
for(i=1;i<=m+1;i++) c[0]=0;
for(i=1;i<=n+1;i++) c[0]=0;
for(i=1;i<=m+1;i++)
for(j=1;j<=n+1;j++)
{ if(x==y[j])
{ c[j]=c[i-1][j-1]+1; b[j]=0; }
else if(c[i-1][j]>=c[j-1])
{ c[j]=c[i-1][j];
b[j]=1; }
else { c[j]=c[j-1];
b[j]=2; }
}
}
void LCS(int i,int j,char *x,int b[Size][Size])
{ if(i==0||j==0) return;
if(b[j]==0)
{ LCS(i-1,j-1,x,b);
printf("%c",x); }
else if(b[j]==1) LCS(i-1,j,x,b);
else LCS(i,j-1,x,b);
}
main()
{ int m,n,i;
int c[Size][Size],b[Size][Size];
char x[Size],y[Size];
printf("输入序列x的长度(小于100):");
scanf("%d",&m);
printf("输入序列y的长度(小于100):");
scanf("%d",&n);
i=1;
printf("输入 x的成员(不用空格,直接输入字符串):\n");
while(i<m+2)
{ scanf("%c",&x);
if(x!='\0') i++;
}
i=1;
printf("输入 y的成员(不用空格,直接输入字符串):\n");
while(i<n+2)
{ scanf("%c",&y);
if(y!='\0') i++;
}
LCSLength(m,n,x,y,c,b);
printf("最长公共子序列:\n");
LCS(m+1,n+1,x,b);printf("\n");
}
|