typescript leetcode刷题28:kmp算法,细谈分布式事务的前世今生

为了降低时间复杂度,让O(mn)的暴力算法(Brute Force)降低到O(n+m),

2. kmp是如何降低时间复杂度的?

构建next数组主要是为了减少重复匹配的消耗,记录部分匹配的信息。
设主串为haystack,子串为needle。haystack的指针为i,长度为m,needle指针为j,长度为n。
与needle匹配意味着与needle的每一个前缀字符串都要匹配。
如果采用暴力算法,那么当部分字符串匹配到中间时,出现无法匹配的字符,则又需要重新开始,但如果当前needle中已经匹配的部分字符串存在与前缀相同的后缀,则haystack也同样,那么可以直接将needle中的指针移动到前缀结束的位置,与haystack对齐后继续进行匹配。而haystack中的指针则可以继续向下,不需要回调。这样haystack中只需要遍历一次,复杂度为O(m),而记录前后缀的next数组则需要在O(n)复杂度内。

3. next数组

next数组中每个位置的值就是该下标应该跳转的目标位置,因此注意:next记录的是当前位置前一位结尾的字符串的最长相同前后缀。遍历needle字符串,设前后缀指针分别为i,j,前缀需要回调,而后缀为遍历指针,next数组主要记录了经过每个位置之后子字符串[0,j]的最大相同前后缀长度。

4. 具体代码步骤:

a.构建next数组
为了进行前后缀匹配,并且next值从下标为2开始有不为1的可能,因此j=2,i=0。
当needle[j-1]==needle[i]时,此时i++。
不相等时则回调,next[i]早已记录好,i=next[i],继续匹配。并且,当i=0时是进行第一位匹配,无需考虑回调。
在每一步遍历记录next[j]=i;
b.匹配
遍历haystack,当不匹配时,回调needle,当needle指针=needle长度时,也就是全部匹配,返回起始点i-j+1
这道题是返回第一个匹配字符串的起始位置,如果返回所有的位置,需要设计res数组,push之后再回调j=next[j]进行下一次的匹配。

function strStr(haystack: string, needle: string): number {
    
    let m=haystack.length;
    let n=needle.length;
    let next=new Array(n+1).fill(0);
    //构建next数组
    for(let i=0,j=2;j<=n;j++){
        while(i>0&&needle[j-1]!=needle[i]){
            i=next[i];
        }
        if(needle[j-1]==needle[i])i++;


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/18a8ed72d958f49537d4808520d1d09d.png)
![img](https://img-blog.csdnimg.cn/img_convert/cfbe608442d16f96bfd30b303ef6913d.png)
![img](https://img-blog.csdnimg.cn/img_convert/c180ad04eb3a37ef4284de43e7164a2b.png)
![img](https://img-blog.csdnimg.cn/img_convert/ada3b13c915a83d972de88551b22cc2a.png)
![img](https://img-blog.csdnimg.cn/img_convert/32ff0fcc2360ea888934fce319cf6573.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
![img](https://img-blog.csdnimg.cn/img_convert/1d1d60eb595875795a167d8c2dd0c3b4.jpeg)



### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/920995b479e98be92e49902c0513216d.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/67f1cf6205c43e4f6cf5a199c2ad83f0.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**


**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/5218ca99a484048e4e4dbc95082d020d.jpeg)

加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-P56XDSbs-1713024860506)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值