#include <iostream>
#include <string>
using namespace std;
int getLCS( string s1, string s2 )
{
int result = 0;
if( 0 == s1.length() || 0 == s2.length() )
{
return result;
}
int len1 = s1.length();
int len2 = s2.length();
string ss1 = s1.substr( 0, len1 - 1 );
string ss2 = s2.substr( 0, len2 - 1 );
if( s1[ len1 - 1 ] == s2[ len2 - 1 ] )
{
result = getLCS( ss1, ss2 ) + 1;
}
else
{
int m = getLCS( s1, ss2 );
int n = getLCS( ss1, s2 );
result = m > n ? m : n;
}
return result;
}
int c[100][100];
int getLCS1( string s1, string s2 )
{
int result = 0;
if( 0 == s1.length() || 0 == s2.length() )
{
return result;
}
int len1 = s1.length();
int len2 = s2.length();
for( int i = 0; i < len1; ++i )
{
c[i][0] = 0;
}
for( int i = 0; i < len2; ++i )
{
c[0][i] = 0;
}
//c[0][0] = 0;
for( int i = 0; i <= len1; ++i )
{
for( int j = 0; j <= len2; ++j )
{
if( s1[i] == s2[j] )
{
if( 0 == i || 0 == j )
{
c[i][j] = 1;
}
else
{
c[i][j] = c[ i - 1 ][ j - 1 ] + 1;
}
}
else
{
if( 0 == i || 0 == j )
{
if( 0 == i && 0 == j )
{
c[i][j] = 0;
}
else if( 0 == i )
{
//c[i][j] = max( c[i][ j - 1 ], c[0][0] );
c[i][j] = c[i][ j - 1 ];
}
else
{
//c[i][j] = max( c[ i - 1 ][j], c[0][0] );
c[i][j] = c[ i - 1 ][j];
}
}
else
{
c[i][j] = max( c[i][ j - 1 ], c[ i - 1 ][j] );
}
}
}
}
return c[ len1 - 1 ][ len2 - 1 ];
}
int main()
{
int ret = 0;
cout << getLCS( "ABCBDAB", "BDCABA" ) << endl;
cout << getLCS1( "ABCBDAB", "BDCABA" ) << endl;
return ret;
}
最长公共子序列(LCS)问题
最新推荐文章于 2023-08-14 09:21:16 发布