最长公共子序列(LCS)问题

来源:互联网 发布:泰勒mac口红 编辑:程序博客网 时间:2024/06/06 11:40
#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;}
0 0
原创粉丝点击