public class KMP {
public static void main(String[] args){
String T = "icocococola";
String P = "cococola";
int[] next = Next(P);
for(int i=0; i<next.length; i++)
System.out.print(next[i]+"\t");
System.out.println();
System.out.println(KMPStrMatching(T, P, next, 0));
}
public static int[] Next(String p){
char[] P = p.toCharArray();
int m = P.length;
if(m<0)
return null;
int[] N = new int[m];
N[0] = 0;
for(int i=1;i<m;i++){
int k = N[i-1];
while(k>0 && P[i]!=P[k])
k = N[k-1];
if(P[i] == P[k])
N[i] = k + 1;
else
N[i] = 0;
}
return N;
}
public static int KMPStrMatching(String t, String p, int[] N, int startIndex){
char[] T = t.toCharArray();
char[] P = p.toCharArray();
int lastIndex = T.length - P.length;
if(lastIndex - startIndex <0)
return -1;
int i;
int j = 0;
for(i = startIndex; i<T.length; i++){
while(P[j]!=T[i] && j>0)
j = N[j-1];
if(P[j] == T[i])
j++;
if(j == P.length)
return i-j+1;
}
return -1;
}
}