zipper题解

link

题目描述

天顶星人使用量子纠缠技术传送信息,量子纠缠超越了我们生活的四维时空,不受四维时空的约束,其传输信息的速度至少比光速快 10000 10000 10000 倍。换句话说,即使传送双方远在宇宙的两端,信息也可以瞬间到达。但天顶星人传送的信息有真有假,判断真假的方式是对三个字符串进行验证,即给三个字符串,判断第三个字符串是否由前两个字符串的一部分序列顺序组成,例如字符串 A A A “ c a t ” “cat” cat,字符串 B B B “ t r e e ” “tree” tree ,字符串 C C C “ t c r a e t e ” “tcraete” tcraete ,字符串 C C C 由字符串 A A A B B B 组成,则信息为真。

再比如字符串 A A A “ c a t ” “cat” cat ,字符串 B B B “ t r e e ” “tree” tree ,字符串 C C C “ c a r t t e e ” “carttee” carttee ,由于组成的序列顺序不对,所以信息应该是假。

输入格式

第一行有一个整数 N N N ,大小在 1 − 1000 1 - 1000 11000,代表后续有 N N N 行,每行有三组字符串数据,每组字符串由空格分隔开,第三组字符串数据的长度总是前两组字符串数据的长度总和。前两行字符串的长度在 1 − 200 1 - 200 1200

输出格式

每行如果信息为真,则打印 Data set n:yes
每行如果信息为假,则打印 Data set n:no
n n n 代表序号。

样例

样例输入

cat tree tcraete
cat tree catrtee
cat tree cttaree

样例输出

Data set 1:yes
Data set 2:yes
Data set 3:no
思路

不难发现这时一道 贪心 搜索。
我们可以分别从每一个字符串的 0 0 0 号位开始搜索。
1. 1. 1. 如果当前遍历到的字符串 1 1 1 n 1 n1 n1 号位与字符串 3 3 3 当前遍历到的 n 3 n3 n3 相等的话,那么就判断 d f s ( n 1 + 1 , n 2 , n 3 + 1 ) dfs(n1 + 1, n2, n3 + 1) dfs(n1+1,n2,n3+1) 是否为真,如果位真。返回真,否则为假。
2. 2. 2. 如果当前遍历到的字符串 2 2 2 n 2 n2 n2 号位与字符串 3 3 3 当前遍历到的 n 3 n3 n3 相等的话,那么就判断 d f s ( n 1 , n 2 + 1 , n 3 + 1 ) dfs(n1, n2 + 1, n3 + 1) dfs(n1,n2+1,n3+1) 是否为真,如果位真。返回真,否则为假。
3. 3. 3. 如果当前遍历到的字符串 1 1 1 n 1 n1 n1 号位与字符串 3 3 3 当前遍历到的 n 3 n3 n3 相等且当前遍历到的字符串 2 2 2 n 2 n2 n2 号位与字符串 3 3 3 当前遍历到的 n 3 n3 n3 也相等。就分别搜索。
d f s ( n 1 + 1 , n 2 , n 3 + 1 ) dfs(n1 + 1, n2, n3 + 1) dfs(n1+1,n2,n3+1)
d f s ( n 1 , n 2 + 1 , n 3 + 1 ) dfs(n1, n2 + 1, n3 + 1) dfs(n1,n2+1,n3+1)

c o d e code code
#include <cstdio>
#include <cstring>
char st1[1005], st2[1005], st3[1005];//三个字符串 
int len1, len2, len3;//字符串长度 
bool dfs(int n1, int n2, int n3) {//n1表示st1用去的长度,n2表示st2用去的长度,n3表示st3用去的长度
	if (n1 == len1 && n2 == len2 && n3 == len3) return true; //如果长度用完,返回true 
	if (st3[n3] == st1[n1] && st3[n3] == st2[n2]) {//字符串1和字符串3相等或字符串2和字符串3相等 
		if (dfs(n1 + 1, n2, n3 + 1) || dfs(n1, n2 + 1, n3 + 1)) return true;//只要有一个为真,返回真 
		else return false;//否则为假 
	} else if (st3[n3] == st1[n1]) {//字符串1和字符串3相等 
		if (dfs(n1 + 1, n2, n3 + 1)) return true;//为真,返回true 
		else return false;//否则为false 
	} else if (st3[n3] == st2[n2]) {//字符串2和字符串3相等 
		if (dfs(n1, n2 + 1, n3 + 1)) return true;//为真,返回true 
		else return false;//否则为false 
	}
	return false;//没有满足条件的为假 
} 
int main() {
	int t, i = 1;
	scanf("%d\n", &t);//输入 
	while (i <= t) {
		memset(st1, 0, sizeof(st1));//清空 
		memset(st2, 0, sizeof(st2));//清空 
		memset(st3, 0, sizeof(st3));//清空 
		scanf("%s %s %s", st1, st2, st3);//输入 
		len1 = strlen(st1), len2 = strlen(st2), len3 = strlen(st3);//求长度 
		if (dfs(0, 0, 0)) printf("Data set %d:yes\n", i);//输出 
		else printf("Data set %d:no\n", i);//输出 
		i++; 
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值