zoukankan      html  css  js  c++  java
  • javascript实现KMP算法(没啥实用价值,只供学习)

    简单粗暴上代码

    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 ();   返回下一个;   }
  • 相关阅读:
    随笔2
    随笔
    关于updateElement接口
    随笔1
    本地访问正常,服务器访问乱码 记录
    Redis (error) NOAUTH Authentication required.解决方法
    tomcat启动很慢 停留在 At least one JAR was scanned for TLDs yet contained no TLDs.
    微信公众号消息回复
    微信公众号 报token验证失败
    idea中web.xml报错 Servlet should have a mapping
  • 原文地址:https://www.cnblogs.com/JhoneLee/p/3601092.html
Copyright © 2011-2022 走看看