方法一:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[210];
char b[210];
char c[210];
bool can[210][210];
void init() {
for (int i = 0; i < 210; i ++) {
for (int j = 0; j < 210; j ++) {
can[i][j] = false;
}
}
can[0][0] = true;
}
bool work(int len_a, int len_b) {
for (int i = 0; i <= len_a; i ++) {
for (int j = 0; j <= len_b; j ++) {
if (i == 0 && j == 0) can[i][j] = true;
else {
if (i >= 1 && c[i+j-1] == a[i-1]) {
can[i][j] = can[i][j] || can[i-1][j];
}
if (j >= 1 && c[i+j-1] == b[j-1]) {
can[i][j] = can[i][j] || can[i][j-1];
}
}
}
}
return can[len_a][len_b];
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i ++) {
scanf("%s", a);
scanf("%s", b);
scanf("%s", c);
init();
int len_a = strlen(a);
int len_b = strlen(b);
printf("Data set %d: ", i);
if (len_a + len_b != strlen(c)){
printf("no\n");
continue;
}
work(len_a, len_b);
if (can[len_a][len_b]) printf("yes\n");
else
printf("no\n");
}
return 0;
}
还可以用深搜:注意对于c【】中的字母如果在a【】和b【】中都有的话,两个都要搜索。
举个例子:
a cat acat