Combine String
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 17 Accepted Submission(s): 11
Problem Description
Given three strings
a
,
b
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''.
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 a , b and c (the length of each string is between 1 and 2000).
Each test case contains three strings a , b 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
题意s1 串 s2串 能够组成s3串。
dp
令f[i][j]代表s1用i了个位置,并且匹配,s2用了j个位置并且匹配。所以每次转移是
f[i-1][j] &&s1[i]==c[i+j] f[i][j]=1 or f[i][j-1]&&s2[j]==c[i+j]
f[i-1][j] &&s1[i]==c[i+j] f[i][j]=1 or f[i][j-1]&&s2[j]==c[i+j]
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
char s1[2005];
char s2[2005];
char s3[2005];
int f[2005][2005];
void work()
{
f[0][0]=1;
int i,j;
int l1=strlen(s1+1);
int l2=strlen(s2+1);
int l3=strlen(s3+1);
if(l1+l2!=l3)
{
cout<<"No"<<endl;
return;
}
for(i=0; i<=l1; i++)
{
for(j=0; j<=l2; j++)
{
if(i&&j)
f[i][j]=0;
if(f[i-1][j] &&s3[i+j]==s1[i]&&i)
f[i][j]=1;
if(f[i][j-1]&&s3[i+j]==s2[j]&&j)
f[i][j]=1;
}
}
if(f[l1][l2])
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
int main()
{
while(scanf("%s%s%s",s1+1,s2+1,s3+1)!=EOF)
work();
return 0;
}