描述
给你一个文本串 T ,一个非空模板串 S ,问 S 在 T 中出现了多少次
数据范围:
1
≤
l
e
n
(
S
)
≤
500000
,
1
≤
l
e
n
(
T
)
≤
1000000
1 \le len(S) \le 500000, 1 \le len(T) \le 1000000
1≤len(S)≤500000,1≤len(T)≤1000000
要求:空间复杂度 O(len(S)),时间复杂度 O(len(S)+len(T))
示例1
输入:“ababab”,“abababab”
返回值:2
示例2
输入:“abab”,“abacabab”
返回值:1
代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算模板串S在文本串T中出现了多少次
* @param S string字符串 模板串
* @param T string字符串 文本串
* @return int整型
*/
//求模式串的next数组
void GetNext(string s,int next[]){
next[1]=0;
int i=1,j=0;
while(i<s.length()){
if(j==0||s[i]==s[j]){
i++;
j++;
if(s[i]==s[j]){
next[i]=next[j];
}else{
next[i]=j;
}
}else{
j=next[j];
}
}
}
int kmp(string S, string T) {
// write code here
S=" "+S;//方便从下标开始求next数组
T=" "+T;
int next[S.length()];
GetNext(S, next);
int i=1,j=1,sum=0;
while(i<T.length()){
if(j==0||T[i]==T[j]){
i++;
j++;
}else{
j=next[j];
}
if(j==S.length()){
sum++;
j=next[j];
}
}
return sum;
}
};