题意:给你3个字符串,问你在不改变前2个字符串排列顺序的情况下能否组成第三个字符串。
解法:DP,状态设计,a[i][j]为1表示第一个字符串的前j个和第二个字符串的前i个可以组成第三个字符串的前i+j个,否则为0;
这样转移方程为:当a[i-1][j]为1且s2[i]==s[i+j]或者a[i][j-1]为1且s1[j]==s[i+j]时a[i][j]为1。
#include <stdio.h>
#include <string.h>
#define N 405
char s1[N], s2[N], s[N];
bool a[N][N];
int main()
{
int t, l1, l2;
scanf("%d", &t);
for(int k = 1; k <= t; k++)
{
scanf("%s %s %s", &s1, &s2, &s);
memset(a, 0, sizeof(a));
l1 = strlen(s1), l2 = strlen(s2);
a[0][0] = 1;
for(int i = 0; i < l1; i++)
{
a[0][i + 1] = (a[0][i] && s1[i] == s[i]);
}
for(int i = 0; i < l2; i++)
{
a[i + 1][0] = (a[i][0] && s2[i] == s[i]);
}
for(int i = 1; i <= l2; i++)
{
for(int j = 1; j <= l1; j++)
{
if(a[i - 1][j] || a[i][j - 1])
{
if(a[i - 1][j] && s2[i - 1] == s[i + j - 1]) a[i][j] = 1;
if(a[i][j - 1] && s1[j - 1] == s[i + j - 1]) a[i][j] = 1;
}
}
}
printf("Data set %d: %s\n", k, a[l2][l1] ? "yes" : "no");
}
return 0;
}