Java KMP匹配演算法的實現
阿新 • • 發佈:2019-02-03
目錄
常規遍歷方法
圖解
KMP匹配演算法
部分匹配表
KMP演算法的關鍵就在於部分匹配表,就是計算出要查詢的字串中重複的部分。這樣查詢就不用從頭開始了,節省了時間。
圖解
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)