最长公共子序列的具体子序列
作者:
Chainsure
,
2022-03-04 23:38:12
,
所有人可见
,
阅读 167
看面经有个问题是求最长公共子序列的具体序列,尝试做了一下,自己写了几个测试用例能通过
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1010;
string a, b;
int dp[N][N];
int main()
{
cin >> a >> b;
int n1 = a.size(), n2 = b.size();
int ed1(0), ed2(0);
int res = 0;
for(int i = 1; i <= n1; ++i)
for(int j = 1; j <= n2; ++j)
{
dp[i][j] = max(dp[i - 1][j], max(dp[i - 1][j - 1], dp[i][j - 1]));
if(a[i - 1] == b[j - 1]) dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1);
res = max(res, dp[i][j]);
if(a[i - 1] == b[j - 1] && res == dp[i][j] && dp[i][j] == dp[i - 1][j - 1] + 1) ed1 = i, ed2 = j;
}
string str;
while(str.size() != res)
{
if(a[ed1 - 1] == b[ed2 - 1] && dp[ed1][ed2] == dp[ed1 - 1][ed2 - 1] + 1) str += a[ed1 - 1], --ed1, --ed2;
else if(dp[ed1][ed2] == dp[ed1 - 1][ed2]) --ed1;
else if(dp[ed1][ed2] == dp[ed1][ed2 - 1]) --ed2;
else if(dp[ed1][ed2] == dp[ed1 - 1][ed2 - 1]) --ed1, --ed2;
}
reverse(str.begin(), str.end());
cout << str << endl;
return 0;
}