牛人进 c求救

来源:百度知道 编辑:UC知道 时间:2024/05/16 17:45:34
输入两个全部由小写字母组成的字符串1和2,如果从字符串2中删掉一些字符,其余字符保持相对位置不变能够得到字符串1,则认为字符串1是字符串2的子序列。
请判断给定字符串1是否为字符串2的子序列。

输入

首先输入一个正整数N,代表有N组数据需要处理。
然后每组数据对应只输入一行,为两个字符串,字符串全部由小写字母组成,最多有100个字符。

输出

对应每组数据输出一行,如果字符串1是字符串2的子序列,则输出1,否则输出0。注意每个答案后面要换行。

样例输入

3
adf abcdefghij
afd abcdefghij
abc def

样例输出

1
0
0
[说明
第一组后面的串删掉bceghij可以得到前面的串,因此输出1
第二组后面的串就算删掉多余字符,但是得到的是adf,而不是afd(注意余下的字符要保持相对位置不变),因此输出0
第三组无论怎么删都得不到前面的串,因此输出0]

提示

因为输入字符串中没有空格,请使用scanf+%s输入。
可以用两个指针分别指向字符串1和字符串2,通过两层嵌套循环来处理。一个可能的思路是外层循环枚举短串的每一个字符,内层循环依次沿着长串寻找匹配的字符,不匹配的字符就跳过。
此题第3组为陷阱数据,如果前两组正确可得2分。

#include <stdio.h>
#include <string.h>
int isSubStr(const char*a, const char*b)
{
int matches = 0;
const char *pa = a, *pb = b;
for (pa = a; pa < a + strlen(a) && pb < b + strlen(b); pa++)
if ((pb = strchr(pb, *pa)) !=NULL) matches++, pb++;
else break;
return matches == strlen(a);
}

int main()
{
int N;
scanf("%d", &N);
while (N--){
char a[100 + 1], b[100 + 1];
printf("%d\n", (scanf("%s%s", a, b), isSubStr(a, b)));
}
return 0;
}