POJ2192
题目:
描述
给定三个字符串,您将通过组合前两个字符串中的字符来确定是否可以形成第三个字符串。前两个字符串可以任意混合,但每个字符串必须保持原来的顺序。
例如,考虑形成“tcraete”从“猫”和“树”:
字符串A:猫
字符串B:树
C:tcraete字符串
正如您所看到的,我们可以通过从两个字符串中交替字符形成第三个字符串。作为另一个例子,考虑形成“catrtee”从“猫”和“树”:
字符串A:猫
字符串B:树
C:catrtee字符串
最后,注意,是不可能形成“cttaree”从“猫”和“树”。
输入
输入的第一行包含一个正整数,从1到1000。它表示要跟踪的数据集的数量。每个数据集的处理是相同的。数据集出现在下列行中,每行一个数据集。
对于每个数据集,输入行由三个字符串组成,由一个空格分隔。所有字符串都由小写字母组成。第三个字符串的长度总是前两个字符串的长度之和。前两个字符串的长度在1到200个字符之间,包括。
输出
对于每个数据集,打印:
数据集N:是的
如果第三个字符串可以从前两个组成,或者
数据集N:否
如果不能。当然N应该被数据集号替换。请参见下面的示例输出示例。
样本输入
3
cat tree tcraete
cat tree catrtee
cat tree cttaree
示例输出
Data set 1: yes
Data set 2: yes
Data set 3: no
#include<iostream>
using namespace std;
#include<string>int main(){
int n;
int id = 1;
string a,b,c;
cin>>n;
for(int i = 0;i < n;i++){
cin>>a>>b>>c;
bool cheat(string a,string b,string c);
cout<<"Data set "<<(id++)<<": ";
cheat(a,b,c);
}
return 0;}bool cheat(string a,string b,string c){
bool bo = false;
int i,j;
int la = a.length();
int lb = b.length();
int can[1024][1024] = {0};
can[0][0] = 1;
for(i = 1;i <= la;i++){//判断行第一个是否正确,如果是就标记为一否则就一行全为零
if(a[i - 1] == c[i - 1]){//判断列第一个是否正确,如果是就标记为一否则就一列全为零
can[0][i] = 1;
}else{
break;
}
}
for(i = 1;i <= lb;i++){
if(b[i - 1] == c[i - 1]){
can[i][0] = 1;
}else{
break;
}
}
for(i = 0;i <= lb;i++){
for(j = 0; j <= la ; j++){
if(can[i][j - 1] == 1 && a[j - 1] == c[i + j - 1]){
can[i][j] = 1;// 判断左边是否为一以及,要添加的字符是否相同
}
if(can[i - 1][j] == 1 && b[i - 1] == c[i + j - 1]){
can[i][j] = 1;//判断上面是否为一以及,要添加的字符是否相同
}
}
}
if(can[lb][la] == 1){//如果最后一个字符也相同就输出yes
cout<<"yes\n";
}else{
cout<<"no\n";
}
return bo;
}