import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算模板串S在文本串T中出现了多少次 * @param S string字符串 模板串 * @param T string字符串 文本串 * @return int整型 */ public int kmp (String S, String T) { // write code here int S_len = S.length(), T_len = T.length(); char[] chs = S.toCharArray(); char[] cht = T.toCharArray(); int val=0; int[] F = new int[S_len]; int i=1,j=0; F[0]=0; while(i<S_len ){ //对S字符串进行预处理,建立内部滑动关系。 if(chs[i]==chs[j]){ F[i] = j+1; i++; j++; } else if(j>0) j = F[j-1]; else{ F[i] = 0; i++; } } i=0; j=0; while(i<T_len){ if(chs[j]==cht[i]){ if(j==(S_len-1)){ val++; j= F[j]; //回到数组最大可滑动幅度 i++; } else{i++;j++;} } else if(j>0) j = F[j-1]; //回到前一个类似的关联点 else i++; } return val; } }