# Combine String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 2945    Accepted Submission(s): 823

Problem Description
Given three strings ab and c, your mission is to check whether c is the combine string of a and b.
A string c is said to be the combine string of a and b if and only if c can be broken into two subsequences, when you read them as a string, one equals to a, and the other equals to b.
For example, adebcf'' is a combine string of abc'' and def''.

Input
Input file contains several test cases (no more than 20). Process to the end of file.
Each test case contains three strings ab and c (the length of each string is between 1 and 2000).

Output
For each test case, print Yes'', if c is a combine string of a and b, otherwise print No''.

Sample Input
abc def adebcf abc def abecdf

Sample Output
Yes No

Source

Recommend
liuyiding

Statistic | Submit | Discuss | Note

s1[i]==s3[I+j].    则dp[i][j]=max(dp[i][j],dp[i-1][j])

s2[j]==s3[I+j].   则dp[i][j]=max(dp[i][j],dp[i][j-1])

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s1[2005],s2[2005],s3[2005];
int v[2005][2005];
int main() {
while (scanf("%s",s1+1)!=EOF) {
scanf("%s%s",s2+1,s3+1);
memset(v, 0, sizeof(v));
v[0][0]=1;
int t1=int(strlen(s1+1)),t2=int(strlen(s2+1));
if((t1+t2)!=strlen(s3+1)){
printf("No\n");
continue;
}
for(int i=0;i<=t1;i++)
for (int j=0; j<=t2; j++) {
if(i>0&&s1[i]==s3[i+j])
v[i][j]=max(v[i-1][j],v[i][j]);
if(j>0&&s2[j]==s3[i+j])
v[i][j]=max(v[i][j-1],v[i][j]);
}
if(v[t1][t2])
printf("Yes\n");
else
printf("No\n");
}
return 0;
}

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120