kmp算法
package com.ming;
import java.util.ArrayList;
public class Code4 {
public static void main(String[] args) {
String s1 = "abc";
String s2= "abca";
System.out.println(KMP(s1,s2));
}
public static int KMP(String s1,String s2){
if(s1 == null || s1.length() == 0 || s2==null || s2.length() == 0) return -1;
int i = 0;
int j = 0;
int[] next = getArr(s1);
while (i<s1.length()&&j<s2.length()){
if(s1.charAt(i) == s2.charAt(j)){
i++;j++;
} else if(next[j]==-1){
i++;
}else {
j = next[j];
}
}
return j ==s2.length() ? j-i:-1;
}
public static int[] getArr(String s1){
if (s1.length() == 1) {
return new int[] {-1};
}
char[] chars = s1.toCharArray();
int[] next = new int[s1.length()];
next[0]=-1;
next[1]=0;
int i=2;
int cn = 0;
while(i<next.length){
if(chars[cn]==chars[i-1]){
next[i++]=++cn;
}else if(cn>0){
cn = next[cn];
}else{
next[i++] = 0;
}
}
return next;
}
}