import java.util.*;
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算模板串S在文本串T中出现了多少次 * @param S string字符串 模板串 * @param T string字符串 文本串 * @return int整型 */ public int kmp (String S, String T) { //特殊情况判断 int m=S.length(),n=T.length(); if(m>n||n==0) return 0;
//初始化计数,获取next数组
int count=0;
int[] next=getNext(S);
//遍历主串和模式串
for(int i=0,j=0;i<n;i++){
//只要不相等,回退到next数组记录的下一位
while(j > 0 && S.charAt(j) != T.charAt(i)){
j = next[j - 1];
}
if(S.charAt(j) == T.charAt(i)) j ++;
if(j == m){
count ++;
j = next[j-1];
}
}
return count;
}
//确定next数组
private int[] getNext(String S){
int len = S.length();
int[] next = new int[len];
for(int i = 1,j = 0;i < len;i ++){
if(j > 0 && S.charAt(j) != S.charAt(i)){
j = next[j -1];
}
if(S.charAt(i) == S.charAt(j)) j++;
next[i] = j;
}
return next;
}
}