import java.util.*;
/**
* NC149 kmp算法
* @author d3y1
*/
public class Solution {
private int result = 0;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算模板串S在文本串T中出现了多少次
* @param S string字符串 模板串
* @param T string字符串 文本串
* @return int整型
*/
public int kmp (String S, String T) {
KMP_MATCHER(T, S);
return result;
}
public int[] COMPUTE_PREFIX_FUNCTION(String S){
int m = S.length();
char[] charsS = S.toCharArray();
int[] prefix = new int[m];
prefix[0] = 0;
int k = 0;
for(int q=2; q<=m; q++){
while (k>0 && charsS[k]!=charsS[q-1]){
k = prefix[k];
}
if(charsS[k] == charsS[q-1]){
k = k+1;
}
prefix[q-1] = k;
}
return prefix;
}
/**
* KMP算法
*
*《INTRODUCTION TO ALGORITHMS》THIRD EDITION.
*
* @param T
* @param S
*/
public void KMP_MATCHER(String T, String S){
int n = T.length();
int m = S.length();
char[] charsT = T.toCharArray();
char[] charsS = S.toCharArray();
int[] prefix = COMPUTE_PREFIX_FUNCTION(S);
int q = 0;
for(int i=1; i<=n; i++){
while (q>0 && charsS[q]!=charsT[i-1]){
q = prefix[q-1];
}
if(charsS[q] == charsT[i-1]){
q = q+1;
}
if(q == m){
result++;
q = prefix[q-1];
}
}
}
}