最长公共子序列

给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则输出-1。

输入描述:

输出包括两行,第一行代表字符串str1,第二行代表str2。(1≤length(str1),length(str2)≤5000)

输出描述:

输出一行,代表他们最长公共子序列。如果公共子序列的长度为空,则输出-1。

示例

输入

1A2C3D4B56
B1D23CA45B6A

输出

123456

说明:

"123456"和“12C4B6”都是最长公共子序列,任意输出一个。

备注:

时间复杂度O(n∗m)O(n*m)O(n∗m),空间复杂度O(n∗m)O(n*m)O(n∗m)。(n,m分别表示两个字符串长度)

参考题解:

#include<iostream>
#include<vector>
using namespace std;
struct node{
    int count;
    string text;
};
int main(){
    string str1,str2;
    cin>>str1>>str2;
    int a=str1.length();
    int b=str2.length();
    vector<vector<node>> dp(a+1,vector<node>(b+1));
    for(int i=0;i<=a;i++){
        dp[i][0].count=0;
    }
    for(int j=0;j<=b;j++){
        dp[0][j].count=0;
    }
    for(int i=1;i<=a;i++){
        for(int j=1;j<=b;j++){
            if(str1[i-1]==str2[j-1]){
                dp[i][j].count=dp[i-1][j-1].count+1;
                dp[i][j].text=dp[i-1][j-1].text+str1[i-1];
            }else{
                if(dp[i-1][j].count>dp[i][j-1].count){
                    dp[i][j].count=dp[i-1][j].count;
                    dp[i][j].text=dp[i-1][j].text;
                }else{
                    dp[i][j].count=dp[i][j-1].count;
                    dp[i][j].text=dp[i][j-1].text;
                }
            }
        }
    }
    if(dp[a][b].count==0){
        cout<<-1;
    }else{
        cout<<dp[a][b].text;
    }
    return 0;
} 

题目链接:https://www.nowcoder.com/questionTerminal/4727c06b9ee9446cab2e859b4bb86bb8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值