剛才看到新聞頻道轉截的一篇文章:阮一峰:字串匹配的KMP演算法,圖文並茂通俗易懂,就用java實現了一下
對於我這個只會排序演算法的人來說,也算是一個比較難的任務了。
上次寫的邏輯有問題,這次不知道有沒有bug。
1 /** 2 * Knuth-Morris-Pratt 演算法 3 * 4 * @author yinqi 5 * @date 2013-5-5 - 上午11:11:56 6 */ 7 public class StringSearchKMP { 8 9 /**10 * @param args11 */12 public static void main(String[] args) {13 int index = knuthMorrisPratt("ABCDABABCDAABCDABCABCDABDABD",14 "ABCDABDABD", 0);15 System.out.println(index);16 }17 18 /**19 * 字串搜尋KMP演算法 <br>20 * 21 * @param searchStr22 * @param matchStr23 * @param start24 * @return25 */26 public static int knuthMorrisPratt(String searchStr, String matchStr,27 int start) {28 char[] searchchar = searchStr.toCharArray();29 char[] mchar = matchStr.toCharArray();30 int[] fixNum = lengthKMP(mchar);31 System.out.println(Arrays.toString(fixNum));32 int neglect = 1;33 for (int i = start; i <= searchchar.length - mchar.length; i += neglect) {34 boolean con = true;35 for (int j = 0; j < mchar.length; j++) {36 if (searchchar[i + j] != mchar[j]) {37 con = false;38 neglect = j + 1 - fixNum[j == 0 ? 0 : j - 1];39 break;40 }41 }42 if (con) {43 return i + 1;44 }45 }46 return -1;47 }48 49 /**50 * 擷取部分匹配值的共有元素的長度 <br>51 * 52 * @param mchar53 * @return54 */55 public static int[] lengthKMP(char[] mchar) {56 int[] fixNum = new int[mchar.length];57 for (int i = 1, j = 0; i < mchar.length; i++) {58 if (mchar[j] == mchar[i]) {59 fixNum[i] = j + 1;60 j++;61 } else if (j > 0) {62 j = 0;63 i -= j;64 }65 }66 // return [0, 0, 0, 0, 1, 2, 0, 1, 2, 0]ABCDABDABD67 return fixNum;68 }69 }70 /*71 * A BC72 * AB C73 * A BCD74 * AB CD75 * ABC D76 * A BCDE77 * AB CDE78 * ABC DE79 * ABCD E 80 */