题目来源:hdu 1503
解题思路:找出最长子串,然后按顺序交替(遇到相同子串则交换一次输出)输出,最长子串值输出一次。
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int f1[105];
int f2[105];
int cnt[105][105];
char path[105][105];
int main()
{
string a, b;
while (cin >> a >> b)
{
memset(path, 0, sizeof(path));
memset(f1, 0, sizeof(f1));
memset(f2, 0, sizeof(f2));
memset(cnt, 0, sizeof(cnt));
int alen = a.length();
int blen = b.length();
for (int i = 0;i < alen;++i)
{
for (int j = 0;j < blen;++j)
{
if (a[i] == b[j])
{
cnt[i + 1][j + 1] = cnt[i][j] + 1;
path[i + 1][j + 1] = '7';
}
else if (cnt[i][j + 1] >= cnt[i + 1][j])
{
cnt[i + 1][j + 1] = cnt[i][j + 1];
path[i + 1][j + 1] = '8';
}
else
{
cnt[i + 1][j + 1] = cnt[i + 1][j];
path[i + 1][j + 1] = '4';
}
}
}
int atmp = alen;
int btmp = blen;
while (path[atmp][btmp])
{
if (path[atmp][btmp] == '7')
{
f1[atmp - 1] = 1;
f2[btmp - 1] = 1;
atmp--;
btmp--;
}
else if (path[atmp][btmp] == '8')
{
atmp--;
}
else if (path[atmp][btmp] == '4')
{
btmp--;
}
}
string outstr;
int i = 0, j = 0;
while (1)
{
for (;i < alen;++i)
if (f1[i])
break;
else
outstr += a[i];
for (;j < blen;++j)
if (f2[j])
break;
else
outstr += b[j];
while (f1[i]&&f2[j])
{
outstr += a[i];
i++;
j++;
if (i == alen&&j == blen)
break;
}
if (i == alen&&j == blen)
break;
}
cout <<outstr << endl;
}
}