比如主字符串A:ABACCCC
和字符串B:ABADD
要在主字符串A里查找有没有字符串B,先比较相同的公共字符串,ABA就是公共字符串,因为A和B的这三个一摸一样,然后A在开头和结尾一样,所以A就是公共前后缀。k就是公共前后缀的长度,在这里是1,就是A,所以就是从k+1开始比较,也就是从A的下标1加上1,也就是2开始比较,也就是B。也就是:
ABACCCC
__ABADD
__12345
借用天琴的视频里边的图
我们在计算第6位的next的值的时候,A是最长的相同前后缀,前面是AB,后面是AA,显然不同。所以k就等于1,next[j],j=3(要比较的位置)就等于k+1,也就是2,所以next【3】=k = 1。
public static int[] getNext(String ps) {
char[] p = ps.toCharArray();
int[] next = new int[p.length];
next[0] = -1;
int j = 0;
int k = -1;
while (j < p.length - 1) {
if (k == -1 || p[j] == p[k]) {
next[++j] = ++k;
} else {
k = next[k];
}
}
return next;
}