前置概念知识:
前缀:不包含最后一个字符的所有以第一个字符开头的连续子串;
后缀:不包含第一个字符的所有以最后一个字符结尾的连续子串。
next数组:存储当前位置之前字符串的最大相等前后缀长度【也是当前位置回溯时访问的数组下标】。
比如, abcdabd 对应 [-1,0,0,0,0,1,2],第一个字符之前没有字符串,这里写为-1
private void getNext(int[] next, char[] cs) {
int j = -1; // 指向当前最大相等前缀的后一位置,也表示最长公共前后缀的长度
int i = 0; // 指向当前最大相等后缀后一位置
next[0] = -1; // -1, 0, ...前两位固定
while (i < cs.length - 1) {
if (j == -1 || cs[j] == cs[i]) {
i++;
j++;
next[i] = j;
} else {
j = next[j];
}
}
}