關於KMP算法的詳細介紹請戳:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.htmlhtml
/** * Created by zhaoyy on 2017/2/6. */ public class KMPDemo { private static int indexOf(CharSequence sequence, CharSequence search) { if (sequence == null || search == null) return -1; int len1 = sequence.length(); int len2 = search.length(); if (len2 == 0) return 0; if (len1 == 0 || len2 > len1) return -1; int[] a = matchValues(search); int i = 0; while (i <= len1 - len2) { int j = 0; while (j < len2) { if (sequence.charAt(i + j) != search.charAt(j)) break; j++; } if (j == len2) return i; int next = j + 1 - a[j]; i += next; } return -1; } private static int[] matchValues(CharSequence cs) { int len = cs.length(); int[] a = new int[len]; for (int i = 0; i < len; i++) a[i] = matchValue(cs, i + 1); return a; } private static int matchValue(CharSequence cs, int n) { for (int i = n - 1; i > 0; i--) { int j = 0; while (j < i) { if (cs.charAt(j) != cs.charAt(n - i + j)) break; j++; } if (j == i) return i; } return 0; } public static void main(String[] args) { String s1 = "ABC"; String s2 = "BC"; System.out.println(s1.indexOf(s2)); System.out.println(indexOf(s1, s2)); } }
說明:在算「部分匹配值」的時候用了一個長度爲len2的數組作緩存用來提升性能(即查表)。java