首先这是next数组的代码:
public static int[] kmpNext(String dest){
//创建一个数组存储部分匹配值
int[] next = new int[dest.length()];
next[0] = 0;//如果字符串长度是1部分匹配值就是0
for (int i = 1,j = 0; i < dest.length(); i++) {
while (j > 0 && dest.charAt(i) != dest.charAt(j)){
j = next[j-1];
//j=0;
}
if (dest.charAt(i) == dest.charAt(j)){
j++;
}
next[i] = j;
}
return next;
}
这里我用的0表示next数组中没有匹配的元素,与用-1一样,所以我这里需要用的j = next[j-1]需要减1.接下来我举一个例子:
index: 0 1 2 3 4 5 6
next : A B A A B A B
value: 0 0 1 1 2 3 2
当求到最后一个元素比较的时候 我这里也就是 i = 6(右边的最后元素) j = 3(左边的最后元素)比较
dest[6] != dest[3]
在这里我们可以看到 j-1代表左边最后元素A的左边一个元素A
while (j > 0 && dest.charAt(i) != dest.charAt(j))由进入判断的J>0 表示最后一次比较之前有相同的元素
由于dest[6] != dest[3]
最后一个元素不同,但是前面一个元素是相同的,所以你需要往前面找看有没有可能和右边最后元素匹配的(类似于KMP思想中字符匹配时没找到完全匹配往后跳跃找与首字符相同的位置一样)也就是j = next[j-1],但是还怎么找呢,还需根据next数组的值,next[j-1]->next[2] = 1表示这个A和前面还有有匹配的字符,
所以再用右边的最后元素和定位的dest[1]进行比较,
发现匹配就J++;这里的J还有值1,所以J=2 ->next[6] = 2
如果发现不匹配就继续上面的步骤找这个元素前面的一个元素 看他的next值是否为0,不为0就同上面的思想继续向前跳跃找匹配的元素,为0就表示没有匹配的了。