#include <bits/stdc++.h>
using namespace std;
int result[1000][1000] = {0};
int getLength(string a, string b) {
for (int i = 0; i <= a.size(); i++)
result[i][0] = 0;
for (int i = 0; i <= b.size(); i++)
result[0][i] = 0;
for (int i = 1; i <= a.size(); i++)
for (int j = 1; j <= b.size(); j++)
result[i][j] = a[i - 1] == b[j - 1] ? result[i - 1][j - 1] + 1 :
(result[i - 1][j] > result[i][j - 1] ? result[i -1][j] : result[i][j - 1]);
return result[a.size()][b.size()];
}
void final(string a, string b) {
deque<char> str;
int length = getLength(a, b), i = a.size(), j = b.size();
while (length)
//字符串a的i位字符没有出现在最大公共子序列
if (result[i][j] == result[i - 1][j])
i--;
//字符串b的j位字符没有出现在最大公共子序列
else if (result[i][j] == result[i][j - 1])
j--;
else
//字符串a和字符串b的最后一个字符相等
//并且此时字符串a或b的最后一个字符出现在最大公共子序列
str.emplace_front(a[i - 1]), length--, i--, j--;
printf("%d\n", str.size());
for (auto it:str)
printf("%c", it);
}
int main() {
string a, b;
getline(cin, a);
getline(cin, b);
final(a, b);
return 0;
}
最长公共子序列(动态规划)
最新推荐文章于 2022-11-15 14:20:36 发布