自己实现了KMP算法
代码如下:
PMT(str){
let next = [], n = 0;
next[0] = 0;
for(let i = 1; i < str.length; i++){
while (n > 0 && str[i] != str[n]){ // 当前字符不等于第n+1位字符 那么n为次大匹配格式再进行判断
n = next[n-1]
}
if (str[i] == str[n]){
n++;
}
next[i] = n;
}
return next;
},
KMP(str,target){
const next = this.PMT(target);
let index = -1;
for (let i = 0; i < str.length; i++) {
for (let j = 0; j < target.length; j++){
if (str[i] == target[j]) { // 如果相等
if (j == target.length-1) { // 完全匹配
index = i - target.length + 1
break;
}
i++;
} else {
i = i - j + next[j]
break;
}
}
}
return index
}
另外可以使用string.indexof(),或者使用regex。
如下例