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

时间:2012-12-05 10:11:16

标签: c++ algorithm

我试图实现动态编程方法来找到两个序列之间最长的公共子序列。当比较的两个字符串长度相同时,我的算法有效,但当第二个字符串比第一个字符串长时,我的LCSLength()函数不会返回正确的值。

以下是包含返回错误值的测试用例的代码。

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int LCSLength(string X,string Y);

int main()
{
    string first ("HELLO");
    string second ("HLOCKKE");
    int LCS;

    //ifstream inData;
    //inData.open("test.dat");

    //inData >> first >> second;
    //inData.close();

    LCS = LCSLength(first,second);
    cout << "The LCS is: " << LCS << endl;
    cout << first << endl;
    cout << second << endl;
    return 0;
}

int LCSLength(string X,string Y)
{
    int m = X.size();
    int n = Y.size();
    int C[m][n];
    for(int i=0; i<=m; i++)
    {
        for(int j=0; j<=n; j++)
            C[i][j] = 0;
    }
    for(int i=1; i<=m; i++)
    {
        for(int j=1; j<=n; j++)
        {
            if(X[i-1]==Y[j-1])
                C[i][j]=C[i-1][j-1]+1;
            else 
                C[i][j]=max(C[i][j-1],C[i-1][j]);
       }
    }

    return C[m][n];
}

这应该打印“LCS是:3”,因为我的两个字符串之间的LCS是3,但是,我的程序没有。我找不到我的错误。谢谢您的帮助。

1 个答案:

答案 0 :(得分:4)

使用一些谷歌搜索修复了我的错误。索引是我的问题。这是正确的代码:

#include <iostream>
#include <string>
#include <fstream>


using namespace std;

int LCSLength(string X,string Y);

int main()
{
    string first ("HELLO");
    string second ("HLOCKKE");
    int LCS;

    //ifstream inData;
    //inData.open("test.dat");

    //inData >> first >> second;
    //inData.close();

    LCS = LCSLength(first,second);
    cout << "The LCS is: " << LCS << endl;
    cout << first << endl;
    cout << second << endl;
    return 0;
}

int LCSLength(string X,string Y)
{
    int m = X.size();
    int n = Y.size();
    int L[m+1][n+1];
    for(int i=0; i<=m; i++)
    {
        for(int j=0; j<=n; j++)
        {
            if(i==0 || j==0)
                L[i][j] = 0;
            else if(X[i-1]==Y[j-1])
                L[i][j] = L[i-1][j-1]+1;
            else
                L[i][j] = max(L[i-1][j],L[i][j-1]);
        }
    }
    return L[m][n];
}