如果p[i]==p[j]->next[i]==j+1,i和j同时后移 如果p[i]!=p[j]->将j指向前一位的next数组对应的值,即j=next[j-1]
public static void strStr(String pp) { if (pp.isEmpty()) return; int m=pp.length(); pp = " " + pp; char[] p = pp.toCharArray(); // 构建 next 数组,数组长度为匹配串的长度(next 数组是和匹配串相关的) int[] next = new int[m + 1]; // 构造过程 i = 2,j = 0 开始,i 小于等于匹配串长度 【构造 i 从 2 开始】 for (int i = 2, j = 0; i <= m; i++) { // 匹配不成功的话,j = next(j) while (j > 0 && p[i] != p[j + 1]) j = next[j]; // 匹配成功的话,先让 j++ if (p[i] == p[j + 1]) j++; // 更新 next[i],结束本次循环,i++ next[i] = j; }
}