当前位置: 首页 > 知识库问答 >
问题:

最长公共子序列不正确打印

宋成天
2023-03-14

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

谢谢

共有1个答案

诸葛煜
2023-03-14

我猜,既然你的停车条件是:

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

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

请注意,您链接的wiki值将字符串定义为X[1.m]和Y[1.n],这可能不是在c中实现这一点的直观方法。

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

 类似资料:
  • longestCommonSubsequence正在返回LCS的长度。代码运行良好。但我试图打印子序列的值。例如,它应该打印“acef”。但我的代码只打印“ae”<如何修复? 这是完整的代码https://pastebin.com/Sq4QMtxF

  • 我试图在c中实现最长公共子序列算法,矩阵c[]]存储最长公共子序列的长度,行[][]存储c[]]矩阵中的父块行,列[][]存储父块列。 我对解决LCS的方法非常不便和低效表示歉意,但什么都没有打印出来。请帮忙。

  • 我想出了一个蛮力算法来寻找两个给定字符串之间最长的公共子序列。它看起来时间复杂度为O(n^3)。它通过了我所有的测试用例,但我仍然不确定它是否会通过所有的测试用例......请让我知道这是正确的蛮力算法? 如果上面的代码不对,我要蛮力算法返回最长的公共子序列字符串,,我怎么才能做到这一点???

  • 然而,我意识到我真正想解决的问题有点不同。给定一个固定的k,我需要确保公共子序列只涉及长度正好为k的子串。例如,设置k=2,并让这两个字符串为 我需要的子序列是“。 是否可以修改动态规划解来解决这个问题?

  • 在最多一个序列存在重复的情况下,可以将最长公共子序列问题转化为最长递增子序列问题。减少问题的过程说明在这里: 假设您有以下序列: 然后,创建一个整数序列S3,其中您必须将S2的每个元素的位置放在S1中(如果元素在S1中不存在,那么忽略那个元素)。在本例中: 这种方法是如何工作的?为什么这种约简解决了寻找最长公共子序列的问题?

  • Iam尝试使用以下代码打印所有可能的最长公共子序列 1-首先,我找到了LCS长度dp矩阵,并尝试使用递归生成所有可能的输出。 输入和输出 实际上,每次我将字符添加到输出列表时,我都需要弹出字符并将其插入为旧的附加新的。但是当我添加行时 然后它只显示了LCS的一种可能性,而不是全部。请帮助,我哪里出错了?