POJ2192

题目大意

给定三个字符串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;
}

原文地址:https://www.cnblogs.com/zjbztianya/p/3252424.html