KMP算法是两个字符串直接快速查找匹配字符串位置的算法,与之对比的还有BF算法,但这个算法效率是在是太低了。下面是对BF算法的一些总结。
// 生成 next 数组,该数组是kmp算法的核心,也是控制着模式串不匹配时的下一个匹配位置
function genNextArr(str) {
let next = new Array(str.length);
// 前缀K , 后缀 J
let k = -1,
j = 0;
next[0] = -1;
// 对比 前后缀指针对应的字符是否匹配,如果匹配了则前后缀字符后移,并确定 next后缀对应的前缀位置(next[j] = k)
// 如果不匹配则前缀K 回滚至 next[K] 对应的位置
while (j < next.length - 1) {
if (k == -1 || str[k] == str[j]) {
k++;
j++;
next[j] = k;
} else {
k = next[k];
}
}
next[0] = 0;
return next;
}
// 利用 next 在目标串中查找存在模式串的位置
function kmp(str1, str2) {
let res = -1;
let j = 0;
let next = genNextArr(str2);
let slen = str1.length;
let tlen = str2.length;
for (let i = 0; i < slen; i++) {
if (str1[i] == str2[j]) {
if (j == tlen - 1) {
res = i - j;
break;
}
j++;
} else {
j = next[j];
}
}
return res;
}