题目描述
天顶星人使用量子纠缠技术传送信息,量子纠缠超越了我们生活的四维时空,不受四维时空的约束,其传输信息的速度至少比光速快 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 1−1000,代表后续有 N N N 行,每行有三组字符串数据,每组字符串由空格分隔开,第三组字符串数据的长度总是前两组字符串数据的长度总和。前两行字符串的长度在 1 − 200 1 - 200 1−200 。
输出格式
每行如果信息为真,则打印 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;
}