给你两个字符串组成一个字符串,在组成的字符串中字符的相对顺序不变的情况下,可以在组成的字符串中找到原先两个字符串...
字母可以错开,但是相对顺序不能变化,要这个组成的字符串中字母数最少..
思路:先求出最长公共子序列,同时记录下路径,记录路径!输出时最长公共子序列的字符只输出一次
这类字符串的题先存一下,估计以后会忘..
using namespace std;
char a[110],b[110],c[210];
int dp[110][110];
struct node
{
int x,y;
char ch;
}ans[210];
int main()
{
while(cin>>a>>b)
{
int i,j;
int l1=strlen(a),l2=strlen(b);
memset(dp,0,sizeof(dp));
for (i=1;i<=l1;i++)
for (j=1;j<=l2;j++)
if (a[i-1]b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if (dp[l1][l2]0)
{
cout<<a<<b<<endl;
continue;
}
while(p>=0&&q>=0)
{
if (dp[p+1][q+1]dp[p][q]+1&&a[p]b[q])
{
ans[k].x=p,ans[k].y=q;
ans[k++].ch =a[p];
p--,q--;
}
else if (dp[p][q+1]>dp[p+1][q])
p--;
else
q--;
}
int x=0,y=0;
for (i=k-1;i>=0;i--)
{
while(x!=ans[i].x)
cout<<a[x],x++;
while(y!=ans[i].y)
cout<<b[y],y++;
cout<<ans[i].ch;
x++,y++;
}
cout<<a+ans[0].x<<b+ans[0].y<<endl;
}
return 0;
}
原文:https://www.cnblogs.com/shidianshixuan/p/13738613.html