美文网首页
javascript 字符串查找 KMP算法 next 详解

javascript 字符串查找 KMP算法 next 详解

作者: 文件转输肋手 | 来源:发表于2019-03-18 16:29 被阅读0次

在leetcode看到了一道字符串查找的问题,我们来使用KMP算法解决这道题,我们先写出来这道题的解法,然后再详细解释一下next 是怎么求出来的.

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

输入: haystack = "hello", needle = "ll"
输出: 2

var strStr = function(haystack, needle) {

var next = getNextArr(needle);
var hasyArr = haystack.split('');
var needleArr = needle.split('');
var i = 0;
var j = 0;
    while(i<hasyArr.length&&j<needleArr.length){
          if(j==-1||hasyArr[i]==needleArr[j]){
             i++;
             j++;
             }else{
                 j=next[j]
             }

        
}
    

        if(j==needleArr.length){
        return i-j
    }else{
        return -1;
    }

    
};

var getNextArr = function (nextStr){
    var nextArr = nextStr.split('');
    var nextArrStr = nextStr.split('');
    var j = 0;
    var k = -1;
    
    nextArr[0]=-1
    while(j<nextArr.length-1){
          if(k===-1||nextArrStr[k] ==nextArrStr[j] ){
             nextArr[++j] = ++k;
             }else{
                 k=nextArr[k];
             }
    }
    
    return nextArr

}

对next的理解

我们首先把nex里面的几个地方的值通过log输出出来

var getNetArr = function (nextStr){
    var nextArr = nextStr.split('');
    var nextArrStr = nextStr.split('');
    var j = 0;
    var k = -1;
    
    nextArr[0]=-1
    while(j<nextArr.length-1){console.log('while',j,k);
          if(k===-1||nextArrStr[k] ==nextArrStr[j] ){console.log('addNex  ',j+1,k+1);
             nextArr[++j] = ++k;

             }else{
                 k=nextArr[k];console.log('change_k    ',j,k)
             }
    }
    
    return nextArr

}

getNetArr('ababcbabc')得到输出

image.png

我们可以看到,当我们求next[j+1]的时候,
就是找从0到j这个子串的最大前后缀,
通过分辨两种情况决定next[j+1]的值,

  1. 如果nextArrStr [k]和nextArrStr[j]相等,那next[j+1] = k+1
  2. 如果nextArrStr [k]和nextArrStr[j]不相等,那么我们就往前找上一个前后缀(也就是next[k]),因为nextArrStr的0到k和j-k到j是一样的,我们只需要进入第一步判断nextArrStr[next[k]]和nextArrStr[j]是否相等即可

参考资料 KMP NEX详解

相关文章

  • javascript 字符串查找 KMP算法 next 详解

    在leetcode看到了一道字符串查找的问题,我们来使用KMP算法解决这道题,我们先写出来这道题的解法,然后再详细...

  • KMP算法文章合集

    字符串的查找:朴素查找算法和KMP算法 暴力匹配算法与KMP算法(串的匹配) 字符串查找算法BF和KMP 字符串匹...

  • 一些有关算法的

    字符串模式匹配算法 字符串的KMP算法详解部分匹配表(即)向右移一位就可以得到next数组。字符串模式匹配算法 R...

  • 算法(2)KMP算法

    1.0 问题描述 实现KMP算法查找字符串。 2.0 问题分析 “KMP算法”是对字符串查找“简单算法”的优化。 ...

  • KMP算法

    很有启发的几篇文章:文章传送门:文章一:KMP算法的Next数组详解文章二:从头到尾彻底理解KMP文章三:字符串匹...

  • KMP算法

    字符串匹配算法之KMP KMP算法最主要的地方是求next数组,next数组保存的是当前失配节点(下标index)...

  • KMP算法理解

    文章大纲:1.KMP算法概念2.KMP算法中最核心的next[] 数组是如何生成的3.使用KMP算法 匹配字符串 ...

  • JavaScript 二分查找 & KMP 算法

    KMP 查找 Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串 str1...

  • 数据结构与算法14-字符串匹配与KMP

    什么是KMP KMP算法是在字符串匹配算法中比较绕的.主要是需要理解KMP中next数组求解的必要性以及j 的回溯...

  • 字符串匹配问题-KMP算法

    什么是KMP KMP算法是在字符串匹配算法中比较绕的.主要是需要理解KMP中next数组求解的必要性以及j 的回溯...

网友评论

      本文标题:javascript 字符串查找 KMP算法 next 详解

      本文链接:https://www.haomeiwen.com/subject/vqlbmqtx.html