KMP算法
1.求next数组
static void getNext(int next[], String p)
{
int pLen = p.length();
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen - 1)
{
//p[k]表示前缀,p[j]表示后缀
if (k == -1 || p.charAt(j) == p.charAt(k))
{
++j;
++k;
next[j] = k;//相同则为next数组上一位加一
}
else
{
k = next[k];//不同则与此位next数组的值对应的字符串值位置做比较;即p[next[k]]==p[j]
}
}
}
//aaba[a]c;next=-101012;aaba[b]c;next[4]=-101010;
2.求找到的序号
public static int KMP(String str1,String str2){
int k=0;
int[] next=new int[str2.length()];
if(str1.length()<str2.length())return -1;
if(str1.equals(str2)||str2.length()==0)return 0;
getNext(next,str2);
for (int i = 0; i < str1.length(); ) {
if(k==-1||str1.charAt(i)==str2.charAt(k)) {//判断是否相同,不相同则与str2[next[k]]位比较,相当于将str2右移k-next[k]位
if(k==str2.length()-1)
return i-str2.length()+1;
i++;
k++;
}
else {
k=next[k];//将next[k]赋予k,意为将str2的第next[k]位与str1的第i位比较
}
}
return -1;//没找到return -1;
}