题目描述
给定两个字符串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;
}