M - 最长公共子序列Lcs(模板)

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。

Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Sample Input

abcicba
abdkscab

Sample Output

abca
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>


using namespace std;
int dp[1005][1005];
string str1,str2;
void printf_lcs(int i,int j)
{
    if(!i||!j)
     return ;

    if(str1[i-1]==str2[j-1])
    {
        printf_lcs(i-1,j-1);
        cout<<str1[i-1];

    }
    else
    {
        if(dp[i-1][j]>dp[i][j-1])
            printf_lcs(i-1,j);
        else
            printf_lcs(i,j-1);
    }


}
int main()
{
    cin>>str1>>str2;
    memset(dp,0,sizeof(dp));
    int len1=str1.size();
    int len2=str2.size();
    for(int i=0;i<=len1;i++)
        for(int j=0;j<=len2;j++)
        {
            if(!i||!j)
                dp[i][j]=0;
            else
            {
                if(str1[i-1]==str2[j-1])
                {
                     dp[i][j]=dp[i-1][j-1]+1;
                }
                else
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
           // cout<<dp[i][j];

        }
    printf_lcs(len1,len2);  //打印出来最长公共子序列
    return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_41700151/article/details/81174531
今日推荐