KMP实现字符串匹配

友友们我上一篇KMP算法一定要学,今天就是梅开二度。

686. 重复叠加字符串匹配 https://leetcode.cn/problems/repeated-string-match/description/

相关KMP算法知识这篇不再赘述,一定要先看上一篇,再看这一篇,按顺序食用

知识点一.临界条件

 能匹配到的情况下是这样的

那匹配不到呢?就是当i指针已经走完一个a串了,j指针还是没有动

此时i-j>a串的长度作为判断寻找模式串结束的条件 。

知识点二.取余

其实我们开始并不知道应该用多少个a串,我们只知道b串,

那应该怎么做呢?

我们知道a串会循环abcd,abcd,...所以我们只要一直走a串就好,

那怎么一直走a串呢?

去余就好了。i%.n就能保证一直走a串了,这样最后能找到落在哪个索引上

所以上面的例子变成这样

所以最后我们知道 ,结束匹配后,索引的位置了

知识点三.通过索引求需要几个a串

附上代码

var repeatedStringMatch = function(a, b) {
    var m = a.length;
    var n = b.length
    let next = new Array(n).fill(0);
    var number = -1;
    next[0] = 0;
    //找next数组
    for(var j=0,i=1;i<=b.length-1;i++){
        while(j>0&&b[i] !== b[j]){
            j=next[j-1]
        }
        if(b[i] == b[j]){
            j++;
        }
        next[i] = j; 
    }
    //知识点一。临界条件
    for(var i=0,j=0;i-j<m;i++){ 
        //知识点二.取余
        while(j>0&& a[i%m] !== b[j]){
            j=next[j-1]
        }
        if(a[i%m] === b[j]){
            j++
        }
        //判断当短串走完,把当前索引记录到number中
        if(j === n) {
           number = i-j+1;
           break;
        }
    }
    if(number === -1){
        return -1
    }else{
        //知识点三。通过索引求需要多少a串
        return Math.ceil((number+n)/m)
    } 
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值