2799 - 单词游戏
单词游戏的规则是按顺序给出3个单词,请你判断最后一个单词是否能够由前两个单词中的所有字母组合而成。前两个单词中的字符可以任意组合。但组合后,第三个单词中的相应字符的前后顺序必须与原前2个单词的相应字符前后顺序保持一致。
题目输入
输入的第一行为一个正整数n(1<=n<=1000),表示测试样例的个数。
接下来n行,每行输入输入3个字符串,字符串之间由一个空格分隔,所有的字符串仅由英文大小写字母组成,区分大小写,即'A' != 'a'。
输入数据保证第3个字符串的长度是前两个字符串长度之和,前两个字符串的长度范围是[1,200]。
题目输出
对于每个输入样例,首先输出“Case N: ”,N表示样例序号,从1开始。
如果第3个单词能够按照要求由前两个单词中的所有字母混合而成,则紧接着输出“yes”,否则输出“no”。
输入/输出样例
题目输入
3 cat tree tcraete cat tree catrtee cat tree cttaree
题目输出
Case 1: yes Case 2: yes Case 3: no
C语言解答
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int n; scanf("%d", &n); int *flag = (int *)malloc(n*sizeof(int)); int i; int j, k; int len_a, len_b, len_c; int site = 0; char a[200]; char b[200]; char c[400]; char *p; char *q; for(i = 0; i < n; i++) { site = 0; flag[i] = 1; scanf("%s", a); scanf("%s", b); scanf("%s", c); len_a = strlen(a); len_b = strlen(b); len_c = strlen(c); if(len_c != len_a + len_b) { flag[i] = 0; continue; } p = a; for(j = 0; j < len_a; j++, p++) { while(*p != *(c+site) && *(c+site) != '\0') { site++; } if(*(c+site) == '\0') { flag[i] = 0; break; } } p = b; site = 0; for(j = 0; j < len_b; j++, p++) { while(*p != *(c+site) && *(c+site) != '\0') { site++; } if(*(c+site) == '\0') { flag[i] = 0; break; } } } for(i = 0; i < n; i++) { if(flag[i]) { printf("Case %d: yes\n", i+1); } else { printf("Case %d: no\n", i+1); } } return 0; }
C++解答
#include<iostream> #include<string> using namespace std; int main() { int n,i,j,k1,k2; char q1,q2; cin>>n; string word1[n],word2[n],word3[n]; string put[n]; for(i=0;i<n;i++) cin>>word1[i]>>word2[i]>>word3[i]; for(i=0;i<n;i++) { k1 = 0; k2 = 0; q1 = word1[i][0]; for(j=0;word3[i][j]!='\0';j++) { if(word3[i][j]==q1) { k1++; q1 = word1[i][k1]; } } q2 = word2[i][0]; for(j=0;word3[i][j]!='\0';j++) { if(word3[i][j]==q2) { k2++; q2 = word2[i][k2]; } } if(q1 == '\0'&&q1 == '\0') put[i] = "yes"; else put[i] = "no"; } for(i=0;i<n;i++) cout<<"Case "<<i+1<<": "<<put[i]<<endl; }