diff --git a/src/class27/Code01_KMP.java b/src/class27/Code01_KMP.java index 653b103..68a51de 100644 --- a/src/class27/Code01_KMP.java +++ b/src/class27/Code01_KMP.java @@ -2,39 +2,41 @@ package class27; public class Code01_KMP { - public static int getIndexOf(String s, String m) { - if (s == null || m == null || m.length() < 1 || s.length() < m.length()) { + public static int getIndexOf(String s1, String s2) { + if (s1 == null || s2 == null || s2.length() < 1 || s1.length() < s2.length()) { return -1; } - char[] str = s.toCharArray(); - char[] match = m.toCharArray(); + char[] str1 = s1.toCharArray(); + char[] str2 = s2.toCharArray(); int x = 0; int y = 0; - int[] next = getNextArray(match); - while (x < str.length && y < match.length) { - if (str[x] == match[y]) { + // O(M) m <= n + int[] next = getNextArray(str2); + // O(N) + while (x < str1.length && y < str2.length) { + if (str1[x] == str2[y]) { x++; y++; - } else if (next[y] == -1) { + } else if (next[y] == -1) { // y == 0 x++; } else { y = next[y]; } } - return y == match.length ? x - y : -1; + return y == str2.length ? x - y : -1; } - public static int[] getNextArray(char[] match) { - if (match.length == 1) { + public static int[] getNextArray(char[] str2) { + if (str2.length == 1) { return new int[] { -1 }; } - int[] next = new int[match.length]; + int[] next = new int[str2.length]; next[0] = -1; next[1] = 0; - int i = 2; - int cn = 0; + int i = 2; // 目前在哪个位置上求next数组的值 + int cn = 0; // 当前是哪个位置的值再和i-1位置的字符比较 while (i < next.length) { - if (match[i - 1] == match[cn]) { + if (str2[i - 1] == str2[cn]) { // 配成功的时候 next[i++] = ++cn; } else if (cn > 0) { cn = next[cn]; diff --git a/src/class28/Code01_Manacher.java b/src/class28/Code01_Manacher.java index 037ddf0..c75975f 100644 --- a/src/class28/Code01_Manacher.java +++ b/src/class28/Code01_Manacher.java @@ -11,10 +11,11 @@ public class Code01_Manacher { // 回文半径的大小 int[] pArr = new int[str.length]; int C = -1; - // 讲述中:R代表最右的扩成功的位置。coding:最右的扩成功位置的,再下一个位置 + // 讲述中:R代表最右的扩成功的位置 + // coding:最右的扩成功位置的,再下一个位置 int R = -1; int max = Integer.MIN_VALUE; - for (int i = 0; i < str.length; i++) { + for (int i = 0; i < str.length; i++) { // 0 1 2 // R第一个违规的位置,i>= R // i位置扩出来的答案,i位置扩的区域,至少是多大。 pArr[i] = R > i ? Math.min(pArr[2 * C - i], R - i) : 1;