力扣算题Days5第二题(js)

题目--KMP算法掌握度20%

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 


代码

1.1朴素我的原版(代码习惯)

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
    let s=0;
  
    for(;s<=haystack.length;s++){
        let i=s,j=0;
        while(j<needle.length ){
            if(haystack[i]===needle[j]){
                i++;
                j++;
            }else{
                break;
            }
        }
              
         if(j===needle.length) return s;
    }
    return -1;
};

1.2朴素优化后

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
    let s=0;
    const n = haystack.length,m=needle.length;
    for(;s<=n-m;s++){
        let i=s,j=0;
        while(j<m && haystack[i]===needle[j]){
              i++;
              j++;
        }
        if(j===needle.length) return s;
    }
    return -1;
};

注意点:

  • for结构
 for(;s<=haystack.length;s++)
  • break的使用
 while(j<needle.length ){
            if(haystack[i]===needle[j]){
                i++;
                j++;
            }else{
                break;
            }
  }

1.3KMP算法

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
    const n=haystack.length,m = needle.length;
    if(m===0){
        return 0;
    }
    const next = new Array(m).fill(0);
    for(let i =1,j=0;i<m;i++){
        while(j>0 && needle[i]!= needle[j]){
            j=next[j-1];
        }
        if(needle[i] === needle[j]){
            j++;
        }
        next[i] = j;

    }
    for(let i=0,j=0;i<n;i++){
        while(j>0&&haystack[i]!=needle[j]){
            j=next[j-1];
        }
        if(haystack[i]===needle[j]){
            j++;
        }
        if(j=== m){
            return i-m+1;
        }
    }
    return -1;
};

KMP算法可以理解,但nexts数组的生成有待进一步理解;

2,学习与总结

  • 朴素算法基本可以自己实现;
  • 巩固了KMP算法思想,但KMP算法next数组生成的代码实现,有待进一步理解!

补充

进一步理解KMP中next的代码实现,用来帮助自己回忆理解过程


告诫自己:贵在坚持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值