版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiang_6/article/details/88544218
想要合并后尽量短,能够省略的必然是lcs
先进行LCS:
找到lcs后,找到两个串相对应的字母,
本题解思路就是在最长公共子序列中插入两个序列中其他的字符
两个字符串先后顺序没所谓
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn = 100 + 7;
char s[maxn];
char t[maxn];
int l1, l2;
int dp[maxn][maxn];
int id1, id2;
void solve() {
memset(dp, 0, sizeof dp);
for(int i = 1; i <= l1; ++i) {
for(int j = 1; j <= l2; ++j) {
if(s[i] == t[j]) {
dp[i][j] = max(dp[i][j], 1+dp[i-1][j-1]);
}
else {
dp[i][j] = max(dp[i][j], max(dp[i][j-1], dp[i-1][j]) );
}
}
}
//cout << dp[l1][l2] << endl;
}
void printlcs(int i, int j) {
if(!i || !j) return;
if(s[i] == t[j] && dp[i][j] == dp[i-1][j-1]+1) {
printlcs(i-1, j-1);
while(id1 < i) putchar(s[id1++]);
while(id2 < j) putchar(t[id2++]);
//cout << i << " .. " << j << " .. " << s[i] << endl;
putchar(s[i]);
id1 = i + 1;
id2 = j + 1;
}
else if(dp[i][j] == dp[i-1][j]) {
printlcs(i-1, j);
}
else {
printlcs(i, j-1);
}
}
int main()
{
while(~scanf("%s", s+1)) {
scanf("%s", t+1);
l1 = strlen(s+1);
l2 = strlen(t+1);
solve();
id1 = id2 = 1;
printlcs(l1, l2);
while(id1 <= l1) putchar(s[id1++]);
while(id2 <= l2) putchar(t[id2++]);
puts("");
}
return 0;
}