int j = 0, k = -1;
next[0] = -1;
while (j < p.length - 1) {
if (k == -1 || p[j] == p[k]) {
// 这里有一个优化的点, 但是这里只写最原始的代码, 如何优化可以参考其他文章
next[++j] = ++k;
} else {
k = next[k];
}
}
System.out.println("next = " + Arrays.toString(next));
return next;
}
先说几个结论:
先说几个结论, KMP的设计思路除了getNext之外, 假设你已经懂了。 对于主串char[] t, 子串char[] p
- 1、next[j]: 表示当p[j] != t[j]时, p串前后缀相等的最大长度。
- 2、next[j] = -1: 表示主串和子串均需要右移
结合这两个结论来分析getNext方法
getNext数组求解过程
public static int[] getNext(String ps) {
char[] p = ps.toCharArray();
int[] next = new int[p.length];
int j = 0, k = -1;
next[0] = -1;
while (j < p.length - 1) {
if (k == -1 || p[j] == p[k]) {