/**
* Java???KMP??
*
* ????????????????г??????????????????????i?????
* ????????????????“???????”????????????“????”???????
* ????ξ???????????б???
*
* ??臨???O(n+m)
*
*/
public class KMP {
//????????????t??next????
public int[] get_next(char[] t){
int lengthT = t.length;
int[] next = new int[lengthT];
next[0] = -1;
int i = 0;
int j = -1;
while(i < lengthT-1){
//t.charAt(i)????????????????t.charAt(j)?????????????
if(j == -1 || t[i] == t[j]){
++i;
++j;
next[i] = j;
}else{
//??????????????j?????
j = next[j];
}
}
return next;
}
//???????next
public int[] get_nextval(char[] t){
int[] nextval = new int[t.length];
nextval[0] = -1;
int i = 0;
int j = -1;
while(i < t.length - 1){
if(j == -1 || t[i] == t[j]){
++i;
++j;
if(t[i] != t[j]){
nextval[i] = j;
}else{
nextval[i] = nextval[j];
}
}else{
j = nextval[j];
}
}
return nextval;
}
//s????????t?????????????????±???????????-1
public int kmp_Index(char[] s?? char[] t){
int[] next = get_nextval(t);
int i = 0;
int j = 0;
while(i <= s.length - 1 && j <= t.length - 1){
if(j == -1 || s[i] == t[j]){
++i;
++j;
}else{
j = next[j];
}
}
if(j < t.length){
return -1;
}else{
return i - t.length;
}
}
public static void main(String[] args) {
KMP kmp = new KMP();
String s = "abbabbbbcab";
String ss = "babbb";
char[] s1 = s.toCharArray();
char[] ss1 = ss.toCharArray();
System.out.println(kmp.kmp_Index(s1?? ss1));;
}
}