最长的公共子序列打印不正确
Longest Common Subsequence incorrect printing
我已经尝试实现最长的公共子序列几个小时了。我已经检查了 LCSLength 函数是否返回正确的长度,但它没有正确打印序列。
int max(int a , int b)
{
if(a>b)
return a;
else
return b;
}
/* The printing function that is not functioning Properly */
string backtrack(vector< vector<int> > C, string X,string Y,int i,int j)
{
if( i==0 || j==0)
return "";
else if( X[i] == Y[j])
return backtrack(C,X,Y,i-1,j-1) + X[i];
else
if( C[i][j-1] >= C[i-1][j] )
return backtrack(C,X,Y,i,j-1);
else
return backtrack(C,X,Y,i-1,j);
}
/* It correctly returns the subsequence length. */
int LCSLength(string s1,string s2)
{
vector< vector <int> > C (s1.size()+1 , vector<int> (s2.size() +1 ) );
int i,j;
int m = s1.size();
int n = s2.size();
for(i =0; i<=m; i++){
for( j =0; j<=n; j++){
if( i==0 || j==0)
C[i][j] = 0;
else if( s1[i-1] == s2[j-1] )
C[i][j] = C[i-1][j-1] +1;
else
C[i][j] = max(C[i][j-1],C[i-1][j]);
}
}
cout << backtrack(C,s1,s2,m,n);
return C[m][n];
}
我遵循这里给出的伪代码:http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
任何帮助,您将不胜感激。
测试案例:
cout << LCSLength("HUMAN", "CHIMPANZEE") << endl;
返回 4,但字符串序列不正确。
cout << LCSLength("AAACCGTGAGTTATTCGTTCTAGAA","CACCCCTAAGGTACCTTTGGTTC") << endl;
返回 14
谢谢。
我猜,因为您的停止条件是:
if( i==0 || j==0)
return "";
您永远无法到达 X[0] 或 Y[0] 处的字符。您的错误打印输出示例("MAN"而不是"HMAN")与此匹配,因为 H 是第一个字符。
请注意,您链接的 wiki 值将字符串定义为 X[1..m] and Y[1..n]
,这可能不是在 c++ 中执行此操作的直观方法。
尝试切换到 -1 作为停止条件,或在开始时填充字符串。
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 为什么这里打印的复数不正确?
- C++:我的简单计算器程序无法打印出来。我也认为我的变量命名不正确
- C++ cout 在擦除换行符后打印字符串不正确
- cout 打印的值不正确
- 菱形打印不正确
- 排序向量不断修改数据并打印不正确的结果
- C++字符串到字符串打印不正确,无法获取 unicode 路径
- 使用图像 8UC1 c++ 的 unchar 垫正确打印不正确
- 最长的公共子序列打印不正确
- 中缀到后缀转换器 + 评估程序正确打印到控制台,但不正确地打印到文本文件
- 为什么打印不正确?
- for_each打印数据不正确
- C编程,数组打印不正确
- 在c++中打印动态创建的负数会导致不正确的输出
- 打印uint8_t变量不正确
- 打印到文件的值不正确.串口通信程序
- PHP扩展值不正确打印原因
- Win32 编辑打印不正确的字符
- 漂亮的打印 - 使用格式不正确的C++代码测试漂亮的打印机