POJ2192

 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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值