ここ数時間、Longest Common Subsequence を実装しようとしています。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を返します
ありがとう。