1265:【例9.9】最长公共子序列
# 题目描述
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列
例如,序列
给定两个序列
# 输入
共有两行。每行为一个由大写字母构成的长度不超过1000的字符串,表示序列
# 输出
第一行为一个非负整数。表示所求得的最长公共子序列的长度。若不存在公共子序列.则输出文件仅有一行输出一个整数0。
# 样例
# 输入样例
ABCBDAB
BDCABA
1
2
2
# 输出样例
4
1
# 提示
最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。字符串长度小于等于1000。
# 源代码
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define M 1000
string s1, s2;
int len1, len2;
int f[M][M], ans;
int main() {
cin >> s1;
cin >> s2;
len1 = s1.size(), len2 = s2.size();
for (int i = 1; i <= len1; i++)
for (int j = 1; j <= len2; j++) {
if (s1[i - 1] == s2[j - 1])
f[i][j] = max(f[i][j], f[i - 1][j - 1] + 1);
else
f[i][j] = max(f[i][j - 1], f[i - 1][j]);
}
printf("%d\n", f[len1][len2]);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
上次更新: 2022/03/28, 14:34:22