给定两个字符串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