目录
常规遍历方法
图解
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)