void preKMP(String s, int kmpNext[]) { int len = s.length(); int k, j; k = kmpNext[0] = -1; j = 0; while (j < len - 1) { if (k == -1 || s.charAt(j) == s.charAt(k)) { if (s.charAt(++j) == s.charAt(++k)) { kmpNext[j] = kmpNext[k]; } else { kmpNext[j] = k; } } else { k = kmpNext[k]; } } }
表示匹配的时候,j 下次前移的位置
public int strStr(String haystack, String needle) { if (needle.length() == 0) return 0; int[] next = new int[needle.length()]; preKMP(needle, next); int i = 0, j = 0; while (i < haystack.length() && j < needle.length()) { if (j == -1 || haystack.charAt(i) == needle.charAt(j)) { i++; j++; } else { j = next[j]; } } if (j == needle.length()) { return i - j; } else { return -1; } }