传送门
描述
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
输入
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入样例
abcicba
abdkscab
输出样例
abca
这个题是dp做的,主要就是要找到状态转移方程,然后逆向找最大的序列。
附上AC代码:
#include<bits/stdc++.h>
#define debug(x) cout<<x<<endl;
using namespace std;
int dp[1010][1010];
int main() {
string a,b;
cin>>a>>b;
for(int i=0; i<a.length(); i++) {
for(int j=0; j<b.length(); j++) {
if(a[i]==b[j])dp[i+1][j+1]=dp[i][j]+1;
else dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
}
}
int i=a.length(),j=b.length();
int tp=dp[i][j];
string ans;
while(i>0&&j>0) {
if(a[i-1]==b[j-1]) {
ans=a[i-1]+ans;
i--;
j--;
} else if(dp[i-1][j] > dp[i][j-1]) {
i--;
} else {
j--;
}
}
cout<<ans<<endl;
return 0;
}