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; } };