1058: simone牌文本编辑器
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 76 Solved: 19
Description
Problem Description
Simone打算写一个功能强大的文本编辑器,并取一个炫酷拉风,高端优雅的名字,比如“simone牌文本编辑器”之类的。既然功能强大,那肯定得有个查找功能吧。但是她在完成这个功能的时候遇到一点小问题。现在来请求你的帮助。
给你一个文本串s,和一个模式串k,你需要写一个程序来查找k在s中出现了多少次。
Input
输入文件的第一行是一个正整数T,表示总共有T组测试数据。
接下来有T组测试,每组测试数据包括两行。第一行是文本串s,长度不大于10000。第二行是模式串k,长度不大于10。都是只有小写字母组成的字符串。
Output
每组测试对应输出一个正整数答案,表示k在s中出现了多少次。
Sample Input
2
abababa
aba
abcabc
abc
Sample Output
3
2
【关键点】长的字符串去匹配短的字符串首字符
#include<stdio.h>
#include<string.h>
int main()
{
int n, i, lengthS, lengthK, d, j, m;
char str[10000], mode[10];
while(scanf("%d", &n)!=EOF){
for(i=0; i<n; i++){
lengthS = 0;
lengthK = 0;
int count = 0;//配对数初始为0
scanf("%s%s", str, mode);
lengthS = strlen(str);
lengthK = strlen(mode);
for(d=0; d<lengthS; d++){
if(str[d] == mode[0]){
count++; //配对了第一个元素,先算作配对了一组
if(lengthK==1){//当模式串为一个字符串时,没有下一个模式串数组元素 需要核对
continue;
}
for(j=1; j<lengthK; j++){
if(str[d+j]!=mode[j] || (d+j)>=lengthS){ //避免文本串为ada,字符串为ad,最后一个a配对a中的a就默认存在ad
count--;//并非每个元素都匹配,不符合
break;
}
}
}
}
printf("%d\n", count);
}
}
return 0;
}