1. 程式人生 > >Java KMP匹配演算法的實現

Java KMP匹配演算法的實現

目錄

常規遍歷方法

圖解

常規方法圖片1

常規方法圖片2

常規方法圖片3

常規方法圖片4

KMP匹配演算法

部分匹配表

KMP演算法的關鍵就在於部分匹配表,就是計算出要查詢的字串中重複的部分。這樣查詢就不用從頭開始了,節省了時間。

KMP圖片1

圖解

KMP圖片2

KMP圖片3

KMP圖片4

KMP圖片5

KMP圖片6

KMP匹配演算法程式碼實現

/**
 * 用於計算匹配的位置(從頭到尾)
 * 
 * @param str
 * @param sub
 * @return
 */
 public static int kmp(String str, String sub) {
    if(str == null || sub == null || str.length() == 0 || sub
.length() == 0){
throw new IllegalArgumentException("str或者sub不能為空"); } int j = 0; int[] n = next(sub); for (int i = 0; i < str.length(); i++) { while(j > 0 && str.charAt(i) != sub.charAt(j)){ j = n[j - 1]; } if(str.charAt(i) == sub
.charAt(j)){
j++; } if(sub.length() == j){ int index = i - j + 1; return index; } } return -1; }
/**
* 用於生成部分匹配表
* 
* @param sub
* @return
*/
private static int[] next(String sub) {
    int[] n = new int[sub.length()];
    int x = 0
; for (int i = 1; i < sub.length(); i++) { while (x > 0 && sub.charAt(x) != sub.charAt(x)) { x = n[x - 1]; } if (sub.charAt(i) == sub.charAt(x)) { x++; } n[i] = x; } return n; }

KMP演算法複雜度

時間複雜度:O(n + m)

原始碼地址