javascript实现KMP算法(没啥实用价值,只供学习)

2023-02-12,,,,

简单粗暴上代码

KMP的原理我就不讲了,想转过弯儿来不容易,建议大家先学会了怎么推导出next数组规律,然后准备两张纸,大纸上写上一行你要匹配的目标字符串,并分别写出位置编号,小纸上写上一行,也写上位置编号和对应的next数组编号,然后移动小纸片模拟匹配过程,你就会了。(用画图模拟也行)

从以上推导过程就能发现KMP算法的规律,得到如下代码:

推导next数组代码:

function getNext(str){
var i=1,j=0;
var next = [null,0];
while(i<str.length){
if(j==0 || str[i]==str[j]){
++i;
++j;
next[i] = j;
console.log('匹配到公共前缀:',`str[i]=${str[i]},str[j]=${str[j]} => i=${i},j=${j} next数组为${next}`)
} else {
console.log('无公共前缀:',`str[i]=${str[i]},str[j]=${str[j]} => j=next[j]=${next[j]} next数组为${next}`)
j = next[j]; }
}
return next;
}

KMP字符匹配算法

String.prototype.KMPsearch = function (str) {

         var len = str.length;
var sstr = this.toString();
var slen = sstr.length;
var i = 0, j = 0, k = 0;
if (slen > 1) {
var next = KMPfunc(this.toString());
while (i < len) {
if (str[i] === sstr[j]) {
if (j == (slen - 1)) {
if (i == (len - 1)) {
return k + 1;
}
else {
k++;
j = 0;
}
}
else {
j++;
i++;
}
}
else if (i == (len - 1) && str[i] != sstr[i]) {
return k;
}
else {
if (j == 0) {
i++;
}
else {
j = next[j - 1];
} }
}
}
else {
for (var i = 0; i < len; i++) {
if (sstr == str[i]) {
k++;
}
}
return k;
}
};

有道词典

function KMPfun ...

详细X

  函数KMPfunc (str) {
  var len = str.length;
  var j = 1,我= 0;
  var下= [1];
  虽然(我< len) {
  如果(j = = 1 | | str[我]= = = str [j]) {
  + +;
  我+ +;
  / /下一个[我]=;
  
  下一个。拼接(我1 j);
  }
  其他{
  / / j =下一个[j];
  j = next.slice (j, + 1);
  }
  }
  next.shift ();
  返回下一个;
  }

javascript实现KMP算法(没啥实用价值只供学习)的相关教程结束。

《javascript实现KMP算法(没啥实用价值,只供学习).doc》

下载本文的Word格式文档,以方便收藏与打印。