最长公共子序列

    科技2023-10-15  105

    题目描述

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

    示例1

    输入

    "1A2C3D4B56","B1D23CA45B6A"

    输出

    "123456"

    说明

    "123456"和“12C4B6”都是最长公共子序列,任意输出一个。 #include<iostream> #include<string> #include<vector> using namespace std; vector<vector<int>> getdp(string s1, string s2){ int len1=s1.length(); int len2=s2.length(); vector<vector<int>> dp(len1, vector<int>(len2,0)); dp[0][0]=s1[0]==s2[0]?1:0; for(int i=1;i<len1;++i){ dp[i][0]=max(dp[i-1][0], s1[i]==s2[0]?1:0); } for(int j=1;j<len2;++j){ dp[0][j]=max(dp[0][j-1],s1[0]==s2[j]?1:0); } for(int i=1;i<len1;++i){ for(int j=1;j<len2;++j){ dp[i][j]=max(dp[i-1][j], dp[i][j-1]); if(s1[i]==s2[j]){ dp[i][j]=max(dp[i][j], dp[i-1][j-1]+1); } } } return dp; } string lcse(string s1, string s2){ if(s1.empty() ||s2.empty()) return "-1"; vector<vector<int>> dp = getdp(s1, s2); int m = s1.length()-1; int n = s2.length()-1; string ret; int index=dp[m][n]-1; while(index>=0){ if(n>0 && dp[m][n]==dp[m][n-1]){ n--; }else if(m>0 && dp[m][n]==dp[m-1][n]){ m--; }else{ ret=s1[m]+ret; index--; m--; n--; } } if(ret.empty()) return "-1"; return ret; } int main(){ string str1, str2; cin>>str1>>str2; cout<<lcse(str1, str2)<<endl; return 0; }

     

    Processed: 0.010, SQL: 8