求问c语言最长公共子序列代码哪里错了!!! 搞了好久,头晕了都。 感觉是对的,就是不行。。。
发布网友
发布时间:2022-05-19 03:26
我来回答
共2个回答
热心网友
时间:2022-05-19 04:56
楼主你好。
#include<stdio.h>
void LCSLength(int m,int n,char *x,char *y,int c[8][7],int b[8][7])
{
int i,j;
//下面两行不怎么需要,因为已经初始化为0了
for(i=0;i<m;i++) c[i][0]=0;//注意应该是从0到m-1
for(i=0;i<n;i++) c[0][i]=0;
for(i=1;i<m;i++){//这里注意应该是从1到m-1
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;
}
}
}
}
void printMatrix(int matrix[8][7]){
int i,j;
for(i=0;i<8;i++){
for(j=0;j<7;j++){
printf("%d ",matrix[i][j]);
}
printf("\n");
}
}
void LCS(int i,int j,char *x,int b[8][7] )
{
if(i==0||j==0) return;
if(b[i][j]==1){
LCS(i-1,j-1,x,b);
printf("%c\n",x[i]);
}else if(b[i][j]==2){//这里注意是==,不是=
LCS(i-1,j,x,b);
}else{
LCS(i,j-1,x,b);
}
}
int main()
{
int c[8][7]={{0}};
int b[8][7]={{0}};
char X[8]={' ','A','B','C','B','D','A','B'};
char Y[7]={' ','B','D','C','A','B','A'};
LCSLength(8,7,X,Y,c,b);
printf("Matrix c\n");
printMatrix(c);
printf("Matrix b\n");
printMatrix(b);
printf("最大公共子序列长度为%d\n",c[7][6]);
LCS(7,6,X,b);
return 1;
}
你运行一下我的代码,没问题的。代码中出现的问题我以注释的形式写出来了。
不过劝告楼主,以后写代码一定要多写一些注释。因为一般的程序员都能写出机器能读懂的代码,而高级程序员才能写出人也能读懂的代码。写注释很重要,显示出代码的思路。否则思路不清晰的高深代码,一开始只有原作者和上帝能懂,过一段时间就只有上帝能懂了。
如果还有问题可以再问。
热心网友
时间:2022-05-19 06:14
你这个会报错的吧 应该是数组 越界
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;}
}
这里你的数组大小 为 c[m][n]那么行序是 0~m-1 列序是 0~n-1 你这里的i<=m j<=n
当i=m 时或 j=n时 就会越界
希望可以帮到你!