给你一个文本串 T ,一个非空模板串 S ,问 S 在 T 中出现了多少次
数据范围:
要求:空间复杂度
,时间复杂度 %2Blen(T)))
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算模板串S在文本串T中出现了多少次
* @param S string字符串 模板串
* @param T string字符串 文本串
* @return int整型
*/
#include <string.h>
int ne[100000];
void getNext(char* a, int next[])
{
int j = 0;
next[0] = 0;
for(int i = 1; i < strlen(a); i++)
{
while(j > 0 && a[i] != a[j])
{
j = next[j - 1]; //回到前一个,相当于自身做了一次kmp
}
if(a[i] == a[j])
{
j++;
}
next[i] = j;
}
}
int kmp(char* S, char* T ) {
// write code here
int i = 0 , j = 0, count = 0;
int slen = strlen(S);
int tlen = strlen(T);
getNext(S, ne);
for(i = 0; i < tlen; i++)
{
if(j == 0 && tlen - i < slen)
break;
while(j > 0 && T[i] != S[j])
{
j = ne[j - 1];
}
if(T[i] == S[j])
{
j++;
}
if(j == slen)
{
count++;
j = ne[j - 1];
}
}
return count;
}
还是跑不完,只能跑5组测试用例,数一大还是超时,还望老哥们赐教