int j = -1;
next[0] = j;
for (int i = 1; i < s.size(); i++) {
while (j >= 0 && s[i] != s[j + 1]) {
j = next[j];
}
if (s[i] == s[j + 1]) {
j++;
}
next[i] = j;
}
}
KMP算法最重要的还是求得next数组的函数,上面是代码随想录给出的一种getNext()函数的实现代码,大致上可以分为三步走。
- 第一步是初始化,定义j并让next数组的第一个元素等于初始的j。
- 第二步是考察前后缀不等时的情况,让前缀末尾的j回退,即j=next[j]。
- 第三步是考察前后缀相等时的情况,只要让j前进就可以了(i在循环中前进),同时此时next[i]的元素要赋值为j,因为此时已经找到了相等的前后缀。