给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
输入样例
abcicba
abdkscab
输出样例
abca
思路:
#include<iostream>
using namespace std;
int dp[1010][1010],c[1010][1010];
char s[1010];
void LCS(string s1,string s2){
int n=s1.length();
int m=s2.length();
// cout<<s1<<s2<<n<<m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
dp[i][j]=0;
c[i][j]=0;
}
}
for(int i=0;i<n;i++)
dp[i][0]=0;
for(int i=0;i<m;i++)
dp[0][i]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s1[i-1]==s2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
c[i][j]=1; //左上
}
else if(dp[i-1][j]>dp[i][j-1]) {
dp[i][j]=dp[i-1][j];
c[i][j]=2; //上
}
else{
dp[i][j]=dp[i][j-1];
c[i][j]=3; //左
}
}
}
int num=dp[n][m];
num--;
for(int i=n,j=m;i>=0&&j>=0;){
if(c[i][j]==1){
i--;j--;
s[num--]=s1[i];
}else if(c[i][j]==2){
i--;
}else{
j--;
}
}
cout<<s;
}
int main(){
string s1,s2;
cin>>s1>>s2;
LCS(s1,s2);
return 0;
}