具體參考http://www.javashuo.com/article/p-hzrrjrai-hg.htmlhtml
/** * 建立next數組(數組第0位沒做用, 從第1位纔是有效位) * @param pattern * @return */ static int[] makeNext(String pattern) { char[] chars = pattern.toCharArray(); int[] next = new int[chars.length + 1]; int i = 1; next[1] = 0; int j = 0; while (i < chars.length) { if (j == 0 || chars[i-1] == chars[j-1]) { i++; j++; next[i] = j; } else { j = next[j]; } } return next; } /** * kmp方法查詢字符串(快速模式匹配算法) * 源字符串中的索引i不會回溯, 比對字符串時 * 找到不同的, 移動模式串的索引j來與源串中i位置再繼續比較 * @param src * @param pattern * @return */ public static int kmpFindStr(String src, String pattern) { int[] next = makeNext(pattern); char[] s = src.toCharArray(); char[] t = pattern.toCharArray(); //j爲模串的索 int j = 0; //i爲源字符串的索引 for(int i = 0; i < s.length;) { if(j == 0 || t[j] == s[i]) { i++; j++; if(j >= t.length) { //找到了 return i - j; } } else { //兩個值不同, 修改j的跳轉位置 j = next[j]; } } return -1; } /** * 測試 * * @param args */ public static void main(String[] args) { int index = kmpFindStr("abf55abaabaca11", "abaabaca"); System.out.print(index); }