Description
你们猜猜영어是什么意思?
??????????????????????
"English is very importan!",诸如此类的声音不停的在Ocean的耳边出现。
现在Ocean为了自己的小小梦想开始了英语的复习之路,但是他碰到一个小问题,需要你来帮助他。
如:字符串"EnglishEnglish"包含了 2 个"English"子串。
PS:子串是指连续的一段字符串,题目要求的合法子串必须是不重叠的。
本题大家请使用scanf("%s", str);输入。
Input
第一行输入一个整数
T
,代表有
T
组测试数据。
每组数据输入一个字符串 str 。
注: 1<=T<=100,1<=|str|<=10000。
每组数据输入一个字符串 str 。
注: 1<=T<=100,1<=|str|<=10000。
Output
对每组测试数据,输出一个整数代表
str
里面一共包含了多少个"English"子串。
Sample Input
3 EnglishEnglish EnglishEnglisp EnglishEnglisH
Sample Output
2 1 1
// 题解: 算法 KMP模板直接用
//代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s[11111],t[10]={'E','n','g','l','i','s','h'};
int next[11111];
int kmp(char *s,int n,char *t,int m)
{
int i = 0;
int j = 0;
int k = 0;
while (i < n )
{
if (j == -1 || s[i] == t[j])
{
++i;
++j;
if (j == m)
k++;
}
else
j = next[j];
}
return k;
}
void getnext(char *t,int m)
{
int i = 0;
int j = 0;
next[0] = -1;
j = next[i];
while (i <m)
{
if (j == -1 || t[i] == t[j])
next[++i] = ++j;
else
j = next[j];
}
}
int main()
{
int m;
scanf ("%d",&m);
while (m--)
{
scanf ("%s",&s);
int l1,l2;
l1 = strlen(s);
l2 = strlen(t);
getnext(t,l2);
printf ("%d\n",kmp(s,l1,t,l2));
}
return 0;
}