题目大意
给定三个字符串s1,s2,s3,判断由s1和s2的字符能否组成字符串s3,并且要求组合后的字符串必须是s1,s2中原来的顺序、
题解
用dp[i][j]表示s1的前i个字符和s2的前j个字符能否组成s3的前i+j个字符,有两个子问题,dp[i-1][j]和dp[i][j-1],如果dp[i-1][j]为真并且s1[i]==s3[i+j]或者dp[i][j-1]为真并且s2[j]==s3[i+j]则dp[i][j]=true;否则dp[i][j]=false;
代码:
#include<cstdio> #include<cstring> using namespace std; #define MAXN 205 bool dp[MAXN][MAXN]; char s1[MAXN],s2[MAXN],s3[MAXN*2]; int main() { int T,p=0; scanf("%d",&T); while(T--) { scanf("%s%s%s",s1+1,s2+1,s3+1); int len1=strlen(s1+1),len2=strlen(s2+1); dp[0][0]=true; for(int i=1; i<=len1; i++) if(dp[i-1][0]&&s1[i]==s3[i]) dp[i][0]=true; for(int i=1; i<=len2; i++) if(dp[0][i-1]&&s2[i]==s3[i]) dp[0][i]=true; for(int i=1; i<=len1; i++) for(int j=1; j<=len2; j++) if((dp[i-1][j]&&s1[i]==s3[i+j])||(dp[i][j-1]&&s2[j]==s3[i+j])) dp[i][j]=true; else dp[i][j]=false; printf("Data set %d: %s ",++p,dp[len1][len2]?"yes":"no"); } return 0; }