纠正一下题目
这道题求的是 最长 公共 子序列
区分一下子序列和子串:
名称 | 区别 | 样例(ABABCDD&AABCDED) |
---|---|---|
最长公共子序列 | 字符相等不必连续(中间可以断开) | AABCDD |
最长公共子串 | 字符必须是相等且连续的(中间不能断开) | ABCD |
由于缩写都是LCS,老师翻译时应该是翻译错了:
最长公共子序列(Longest Common Subsequence)
最长公共子串(Longest Common Substring)
要按照最长公共子序列的写法写哦!
AC CODE:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 3005
using namespace std;
int dp[MAXN][MAXN];
char s[MAXN], t[MAXN];
void print(int i, int j){
//递归输出最长公共子序列。
if(i == 0 || j == 0) return;
if(s[i] == t[j]){
print(i-1, j-1);
putchar(s[i]);
}
else{
if(dp[i-1][j] >= dp[i][j-1])
print(i-1, j);
else
print(i, j-1);
}
}
int main(){
scanf("%s", s+1);
scanf("%s", t+1);
int sl = strlen(s+1);
int tl = strlen(t+1);
for(int i = 1; i <= sl; i++)
for(int j = 1; j <= tl; j++)
if(s[i] == t[j])dp[i][j] = dp[i-1][j-1]+1;
else dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
print(sl, tl);
return 0;
}