需求
描述
给定两个字符串,求他们的最长公共子序列,其中子序列是可以不连续的。
输入
abcfbc abfcab
programming contest
abcd mnp
输出
4
2
0
分析
使用动态规划,我们定义maxLen[i][j]
为左字符串从头开始的连续i
个字符与右字符串从头开始的连续j
个字符的最大公共子序列,然后可以得到边界及状态转移方程。
代码
#include <iostream>
#include <cstring>
using namespace std;
char s1[1000];
char s2[1000];
int maxLen[1000][1000];
int main() {
// freopen("f:\\data.txt", "r", stdin);
while (cin >> s1 >> s2) {
//边界状态 arr[i][0],arr[0][j]都设为0
int i, j, len1 = strlen(s1), len2 = strlen(s2);
for (i = 1; i <= len1; i++) maxLen[i][0] = 0;
for (j = 1; j <= len2; j++) maxLen[0][j] = 0;
//根据状态转移方程计算其它位置状态
for (i = 1; i <= len1; i++)
for (j = 1; j <= len2; j++)
if (s1[i - 1] == s2[j - 1])
maxLen[i][j] = maxLen[i - 1][j - 1] + 1;
else
maxLen[i][j] = max(maxLen[i - 1][j], maxLen[i][j - 1]);
//输出最后位置的状态,即为最大值
cout << maxLen[len1][len2] << endl;
}
return 0;
}