一、KMP算法例子
public class KMP {
int[] t = new int[]{'a','b','c','a','b','a','a'};
int[] nextVal = new int[100];
int[] s = new int[]{'a','b','c','a','a','b','b','a','b','c','a','b','c','a',
'b','a','a','c','b','a','c','b','a'};
public void getNextVal(){//获得t的nextVal值
int j=0,k=-1;nextVal[0]=-1;
while (j<t.length-1){
if (k == -1 || t[j] == t[k]){
j++;k++;
if (t[j] != t[k]) nextVal[j]=k;
else nextVal[j] = nextVal[k];
}
else{
k = nextVal[k];
}
}
}
public int KmpIndex(){//通过nextVal与s得到匹配串的初始下标
int i=0,j=0;
getNextVal();
while (i < s.length && j < t.length){
if ( j == -1 || s[i] == t[j]){
i++;j++;
}
else{
j = nextVal[j];
}
}
if (j>=t.length){
return i-t.length;
}else{
return -1;
}
}
public static void main(String[] args) {
System.out.println(new Main().KmpIndex());
}
}
二、KMP详解