class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算模板串S在文本串T中出现了多少次
* @param S string字符串 模板串
* @param T string字符串 文本串
* @return int整型
*/
int kmp(string S, string T) {
//求NEXT数组
int j=0,m=S.size();
int nextTB[S.size()+1];
nextTB[j]=-1;
int i=nextTB[j];
while(j<m){
if(i==-1|| S[j]==S[i]){//初始或者当前匹配值相同
i++;
j++;
nextTB[j]=i;//nextTB[j+1]=nextTB[j]+1
}
else i=nextTB[i];//不匹配则继续比较,i->next[i] ->next[next[i]],直到最终i=-1
}
//KMP匹配
int n=T.size();
int jj=0,ii=0;
int flag=0;//统计匹配成功次数
while(ii<n){
if(jj==-1||S[jj]==T[ii]){
ii++;
jj++;
}
else jj=nextTB[jj];
if(jj==m){
flag++;
jj=nextTB[jj];//允许重复匹配
}
}
return flag;
}
};