#include <stdio.h>
#include <string.h>
#define N 100
int lcslength(char a[], char b[], int c[N][N]);
char *lcs(char str[], char a[], char b[]);
int c[N][N];
char str[N];
int lcslength(char a[], char b[], int c[N][N])
{
int i, j, sa , sb;
sa = strlen(a);
sb = strlen(b);
for (i = 0; i < sa; i++)
c[i][0] = 0;
for (j = 0; j < sb; j++)
c[0][j] = 0;
for(i = 1; i <= sa; i++ )
for( j = 1; j <= sb; j++)
{
if(a[i-1] == b[j-1])
{
c[i][j] = c[i-1][j-1] + 1;
}
if(c[i-1][j] > c[i][j-1])
{
c[i][j] = c[i-1][j];
}
else
{
c[i][j] = c[i][j-1];
}
}
return c[sa][sb];
}char *lcs(char str[], char a[], char b[])
{
int i, j;
int k;
i = strlen(a);
j = strlen(b);
k = lcslength(a,b,c);
str[k] = '\0';
k = k -1;
while(k >= 0)
{
if(c[i][j] == c[i-1][j]) i--;
if(c[i][j] == c[i][j-1]) j--;
else
{
str[k] = a[i-1];
k--;
i--;
j--;
}
}
return str;
}
int main()
{
char a[N], b[N];
printf("input the first array:\n");
gets(a);
printf("input the second array:\n");
gets(b);
printf("the lcs:\n");
puts(lcs(str, a, b));
return 0;
}
是return c[sa][sb]没有返回值吗?
能不能有人具体指出来
#include <string.h>
#define N 100
int lcslength(char a[], char b[], int c[N][N]);
char *lcs(char str[], char a[], char b[]);
int c[N][N];
char str[N];
int lcslength(char a[], char b[], int c[N][N])
{
int i, j, sa , sb;
sa = strlen(a);
sb = strlen(b);
for (i = 0; i < sa; i++)
c[i][0] = 0;
for (j = 0; j < sb; j++)
c[0][j] = 0;
for(i = 1; i <= sa; i++ )
for( j = 1; j <= sb; j++)
{
if(a[i-1] == b[j-1])
{
c[i][j] = c[i-1][j-1] + 1;
}
if(c[i-1][j] > c[i][j-1])
{
c[i][j] = c[i-1][j];
}
else
{
c[i][j] = c[i][j-1];
}
}
return c[sa][sb];
}char *lcs(char str[], char a[], char b[])
{
int i, j;
int k;
i = strlen(a);
j = strlen(b);
k = lcslength(a,b,c);
str[k] = '\0';
k = k -1;
while(k >= 0)
{
if(c[i][j] == c[i-1][j]) i--;
if(c[i][j] == c[i][j-1]) j--;
else
{
str[k] = a[i-1];
k--;
i--;
j--;
}
}
return str;
}
int main()
{
char a[N], b[N];
printf("input the first array:\n");
gets(a);
printf("input the second array:\n");
gets(b);
printf("the lcs:\n");
puts(lcs(str, a, b));
return 0;
}
是return c[sa][sb]没有返回值吗?
能不能有人具体指出来
解决方案 »
- installsheild2009救命的问题!
- 重载CWnd::OnSysCommand()的时候,如何控制光标的位置?
- 向高手求教windowless的问题
- 关于Combo Box 和Check Box的问题
- 怎样将一个checkbox 设成非选中?
- 请问路由机制与代理机制的数据报格式有什么不同 ?
- ▉▉★正在学习《C++ Primer》这本书的朋友请留下你的QQ号,互相交流。★▉▉
- mfc中基于VC编程复制文件夹怎么计算最后的平均拷贝速度?
- 进度条文本提示问题
- 辛苦了一个晚上,终于搞定了98/2000的自动关机程序,提供原码连接,大家来下载吧
- 请教关于运行时改变资源内容的问题.
- 对bitMapInfo.bmiColors[j]赋值进入死循环。
if(a[i-1] == b[j-1])
{
c[i][j] = c[i-1][j-1] + 1; // 假设这里c[i][j] 变为1
}
// 因为这里都初始化为0,所以不会出现c[i-1][j] > c[i][j-1]) 的情况
if(c[i-1][j] > c[i][j-1])
{
c[i][j] = c[i-1][j];
}
else
{
c[i][j] = c[i][j-1]; // 所以这里c[i][j]又被重新赋值为0
}
结果是即使经过多重循环 ,c[i][j]都是为0
也就是说
k = lcslength(a,b,c); // 这里k一直是0
str[k] = '\0'; 所以puts(lcs(str, a, b));
没有结果输出就不足为奇了。
X = { x1 , x2 , ... , xm }
Y = { y1 , y2 , ... , yn }
求X和Y的一个最长公共子序列举例
X = { a , b , c , b , d , a , b }
Y = { b , d , c , a , b , a }
最长公共子序列为
LSC = { b , c , b , a
中的
if(a[i-1] == b[j-1])
{
c[i][j] = c[i-1][j-1] + 1; // 假设这里c[i][j] 变为1
}
// 因为这里都初始化为0,所以不会出现c[i-1][j] > c[i][j-1]) 的情况
if(c[i-1][j] > c[i][j-1])
{
c[i][j] = c[i-1][j];
}
else
{
c[i][j] = c[i][j-1]; // 所以这里c[i][j]又被重新赋值为0
}
你执行玩{a,b,c,b,d,a,b}中的第一个b后,再执行c时,就有if(c[i-1][j] > c[i][j-1])
{
c[i][j] = c[i-1][j];
}
这种情况了
字符串a : a , b , c , b , d , a , b字符串b: b , d , c , a , b , a 照你的说法, 执行c时,也就是说i==3时,我在i==3时设了一个条件断点,证实c[i-1][j] 和 c[i][j-1]的值都是0.兄弟,不用画表这么麻烦吧,在vc上调试一下,一切都很清楚。
我这里有个正确的代码,当时是照着这个编的.
//求给定的两个字符串的最大公共子串
#include<iostream>
#include<string>
using namespace std;
const int n=100;
int c[n][n];
char str[n];
int lcs_len(string a,string b,int c[][n])
{
int sa=a.length();
int sb=b.length();
int i,j;
for(i=0;i<=sa;++i)c[i][0]=0;
for(j=0;j<=sb;++j)c[0][j]=0;
for(i=1;i<=sa;++i)
{
for(j=1;j<=sb;++j)
{
if(a[i-1]==b[j-1])c[i][j]=c[i-1][j-1]+1;
else if(c[i][j-1]>c[i-1][j])c[i][j]=c[i][j-1];
else c[i][j]=c[i-1][j];
}
}
return c[sa][sb];
}
char* bulid_lcs(char str[],string a, string b)
{
int k,i=a.length(),j=b.length();
k=lcs_len(a,b,c);
str[k]='\0';
while(k>0)
{
if(c[i][j]==c[i-1][j])i--;
else if(c[i][j]==c[i][j-1])j--;
else
{
str[--k]=a[i-1];
i--;j--;
}
}
return str;
}
int main()
{
string a,b;
cout<<"enter two strings\n";
cout<<"enter first string:";
cin>>a;
cout<<"enter second string:";
cin>>b;
cout<<bulid_lcs(str,a,b);
system("PAUSE");
return 0;
}
这是正确代码!
动态规划的方法
{
c[i][j] = c[i-1][j-1] + 1;
}
if(c[i-1][j] > c[i][j-1])
{
c[i][j] = c[i-1][j];
}
else
{
c[i][j] = c[i][j-1];
} 和 if(a[i-1]==b[j-1])c[i][j]=c[i-1][j-1]+1;
else if(c[i][j-1]>c[i-1][j])c[i][j]=c[i][j-1];
else c[i][j]=c[i-1][j]; 兄弟,你认为这两段代码一样吗?
不知道是不是浪费时间,总想学高手们一下子就知道
原因,但是却不能够.是不是这是程序员必须经历的一个坎.
不是return c[sa][sb]没有返回值,而是是0,所以什么都没有。