C++ 最长公共子字错误结果
我一直在尝试编写一个程序,计算两个字符串共有的最长公共连续序列(或子字)。代码工作时没有任何语法错误,但每次我得到像237743等乱七八糟的随机结果时,希望有人能找出我哪里出了错。 例如 如果我将第一个字输入为“stack”,将第二个字输入为“stackoverflow”,则输出值应为5(公共字=stack,长度为5),但它将为我提供“2752053”C++ 最长公共子字错误结果,c++,algorithm,dynamic-programming,C++,Algorithm,Dynamic Programming,我一直在尝试编写一个程序,计算两个字符串共有的最长公共连续序列(或子字)。代码工作时没有任何语法错误,但每次我得到像237743等乱七八糟的随机结果时,希望有人能找出我哪里出了错。 例如 如果我将第一个字输入为“stack”,将第二个字输入为“stackoverflow”,则输出值应为5(公共字=stack,长度为5),但它将为我提供“2752053” #include <iostream> using namespace std; int getlcw(char arr1[],
#include <iostream>
using namespace std;
int getlcw(char arr1[],char arr2[])
{
u=sizeof(arr1)/sizeof(arr1[0]);
v=sizeof(arr2)/sizeof(arr2[0]);
if(u==0||v==0)
{ cout<<"fail";
return 0;
}
int lcw[u+1][v+1]; \\1 extra row and column to indicate word has ended , no chance for subword
int maxlcw=0;
for(int i=0;i<u+1;++i) \\intialise last row and col to 0
{
lcw[i][v+1]=0;
}
for(int i=0;i<v+1;++i)
{
lcw[u+1][i]=0;
}
for(int i=u;i>=0;--i)
{
for(int j=v;j>=0;--j)
{
if(arr1[j]==arr2[i])
lcw[i][j]=1+(lcw[i+1][j+1]);
else
lcw[i][j]=0;
if(lcw[i][j]>maxlcw)
maxlcw=lcw[i][j];
}
}
return maxlcw;
}
int main()
{ int x,y;
cout<<"enter size of word 1\n";
cin>>x;
char arr1[x];
cout<<"enter size of word 2\n";
cin>>y;
char arr2[y];
cout<<"word 1\n";
for(int i=0;i<x;++i)
{
cin>>arr1[i];
}
cout<<"word 2\n";
for(int j=0;j<y;++j)
{
cin>>arr2[j];
}
int ans=getlcw(arr1,arr2);
cout<<ans;
cin>>x;
}
#包括
使用名称空间std;
int getlcw(字符arr1[],字符arr2[]
{
u=sizeof(arr1)/sizeof(arr1[0]);
v=sizeof(arr2)/sizeof(arr2[0]);
如果(u==0 | | v==0)
{cout你可以用两种方法解决它,回顾一下:
自上而下的方法:
int getlcw(char arr1[],char arr2[])
{
u=sizeof(arr1)/sizeof(arr1[0]);
v=sizeof(arr2)/sizeof(arr2[0]);
if(u==0||v==0)
{ cout<<"fail";
return 0;
}
int lcsw[u+1][v+1]; \\1 extra row and column to indicate word has ended , no chance for subword
int maxlcw=0;
for(int i=0; i<u+1;i++)
{
for(j=0; j<v+1; j++)
{
if(i == j) lcsw[i][j] = 0;
if(arr1[i]!= arr2[j]) lcsw[i][j] = 0;
else
{
lcsw[i][j] = 1+lcsw[i-1][j-1];
maxlcw= max(maxlcw, lcsw[i][j]);
}
}
}
return maxlcw;
}
int-getlcw(字符arr1[],字符arr2[]
{
u=sizeof(arr1)/sizeof(arr1[0]);
v=sizeof(arr2)/sizeof(arr2[0]);
如果(u==0 | | v==0)
{您需要调整“一切似乎都很好”的概念,并学习如何使用调试程序添加具有预期结果和生成结果的示例。尝试调试!这样做了。很抱歉,我是这里的新手。通常,请检查数组索引…如果您有一个长度x
的数组,则有效索引在[0,x-1]范围内
。如果您尝试访问索引[x]
,它将超出范围-您在代码中经常这样做。
int getlcw(char arr1[],char arr2[])
{
u=sizeof(arr1)/sizeof(arr1[0]);
v=sizeof(arr2)/sizeof(arr2[0]);
if(u==0||v==0)
{ cout<<"fail";
return 0;
}
int lcsw[u+1][v+1]; \\1 extra row and column to indicate word has ended , no chance for subword
int maxlcw=0;
for(int i=u;i>=0;i--)
{
for(int j=v;j>=0;j--)
{
if(i == j) lcsw[i][j] = 0;
if(arr1[i]!= arr2[j]) lcsw[i][j] = 0;
else
{
lcsw[i][j] = 1+lcsw[i+1][j+1];
maxlcw= max(maxlcw, lcsw[i][j]);
}
}
}
}