Combine String
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 2210 Accepted Submission(s): 624
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
YesNo
很屌丝的题。。
看到的第一眼暴力while走了一遍。。
贪心思想觉得没毛病啊///可是真的有毛病啊。。。
wa了4发。。
得到一组数据
ab
abc
aabcb
abc
ab
aabcb
两个都是Yes
贪心会有一个No
果断dp
dp【i】【j】
i是s1 的某个
j是s2
if(s1[i]==s[i+j]) dp[i+1][j]|=dp[i][j]; if(s2[j]==s[i+j]) dp[i][j+1]|=dp[i][j];
#include<stdio.h> #include<string.h> int dp[2003][2003]; char s[2003]; char s1[2003]; char s2[2003]; int main() { while(~scanf("%s %s %s",s1,s2,s)) { memset(dp,0,sizeof(dp)); int Flag=0; int len1=strlen(s1); int len2=strlen(s2); int len=strlen(s); dp[0][0]=1; for(int i=0;i<=len1;i++) { for(int j=0;j<=len2;j++) {
} } if(dp[len1][len2]&&len==len1+len2) printf("Yes\n"); else printf("No\n"); }}if(s1[i]==s[i+j]) dp[i+1][j]|=dp[i][j]; if(s2[j]==s[i+j]) dp[i][j+1]|=dp[i][j];