Kmp算法是什么
KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。 常规的匹配算法是当模式串的i位置目标串的j位置失配时,模式串指针i回到0位置,目标串指针回到j-i+1位置;Kmp算法无需移动目标串指针,只需移动模式串指针,该算法的核心是next数组的计算。
匹配原理图
如图,当目标串与模式串在图示失配时,根据next数组令模式串指针i=3
Next数组的计算方式
可得到next数组
下面给出Java实现
public class Kmp {
private static String src = null;
private static String parten = null;
private static int[] next;
private static int len;
private Kmp(String src, String parten) {
super();
}
public static boolean doPartten(String src, String parten) {
// 初始化
Kmp.src = src;
Kmp.parten = parten;
len = parten.length();
next = new int[len];
getNext();
// 开始匹配
int j = 0;
int length = src.length();
for (int i = 0; i < length; i++) {
while (parten.charAt(j) != src.charAt(i)) {
j = next[j];
if ((j == 0 && parten.charAt(j) != src.charAt(i))) {
j = -1;
break;
}
}
if (++j == len) {
return true;
}
}
return false;
}
private static void getNext() {
next[0] = 0;
for (int i = 1; i < len; i++) {
for (int j = i - 1; j > 0; j--) {
String s1 = parten.substring(0, j - 1);
String s2 = parten.substring(i - j + 1, i);
if (s1.equals(s2) && j > next[i]) {
next[i] = j - 1;
}
}
}
}
}