最长公共子序列错误打印

Posted

技术标签:

【中文标题】最长公共子序列错误打印【英文标题】:Longest Common Subsequence incorrect printing 【发布时间】:2013-11-12 21:24:15 【问题描述】:

我已经尝试实现最长公共子序列几个小时了。我检查了 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

谢谢。

【问题讨论】:

"...但字符串顺序不正确。"它给出了什么不正确的序列 它为第一个测试用例给出“MAN”,应该是“HMAN”,对于第二个序列,它给出“ACCAAGTCTG”,应该是“ACCTAGTATTGTTC” 我想知道 - 当第一个字母不在 LCS 中时它是否有效,例如关于“XHUMAN”和“CHIMPPANZEE”?也许长度限制已关闭 【参考方案1】:

我猜是因为你的停止条件是:

if( i==0  || j==0)
     return "";

你永远无法到达 X[0] 或 Y[0] 处的角色。您的错误打印输出示例(“MAN”而不是“HMAN”)与此匹配,因为 H 是第一个字符。

请注意,您链接的 wiki 值将字符串定义为 X[1..m] and Y[1..n],这可能不是在 c++ 中执行此操作的直观方式。

尝试切换到 -1 作为停止条件,或在开头填充字符串。

【讨论】:

有缺陷的逻辑:/ else if(X[i] == Y[j]) return backtrack(C,X,Y,i-1,j-1) + X[i] 我有将其更改为 else if( X[i-1] == Y[j-1]) return backtrack(C,X,Y,i-1,j-1) + X[i-1] 它起作用了。无论如何感谢您的帮助! 对,我知道 wiki 示例也是如此。无论哪种方式,关键是原始代码永远无法将 X[i] 或 Y[i] 连接到字符串。希望有所帮助:)

以上是关于最长公共子序列错误打印的主要内容,如果未能解决你的问题,请参考以下文章

最长公共子串与最长公共子序列之间的关系

MATLAB 最长公共子序列

动态规划 最长公共子序列 过程图解

算法 动态规划 ------最长公共子序列

最长公共子序列长度函数没有返回正确的长度?

最长公共子序列的应用