代码随想录训练营day09|KMP算法:找出一个字符串中第一个匹配下标、重复的子字符串

本文介绍了KMP算法在找出字符串中第一个匹配项下标的应用,阐述了KMP算法避免暴力遍历的优化思路,并详细解释了next数组的生成及其在算法中的作用。通过KMP算法,可以有效地解决字符串匹配问题,降低时间复杂度。此外,还讨论了如何利用KMP算法找出字符串中的重复子串。
摘要由CSDN通过智能技术生成

一、找出字符串中第一个匹配项下标

KMP算法的产生基于下面的一个实际场景:

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

如果我们采用暴力解法,即直接遍历每个字符串元素,设haystack的长度为n,needle的长度为m,从haystack的第一个字符开始遍历n个,如果不匹配,从下一个字符重新开始遍历。

这样做的话,如果遇到最坏的情况,就是前m-1个相同,最后一个不同,导致需要从头遍历到尾,这样的时间复杂度为O(m*n)。效率很低。

导致暴力算法效率低的原因是因为我们在匹配一段字符后,没有将其利用上,而是直接对于主串后移,重新开始遍历。而KMP算法的基本思路就是基于此来做出改变的。

假设有这样的两个字符串,我们发现匹配到最后时有一个字符不匹配,那么能否避免上面主串不同于暴力算法中指针回退,即让我们主串的指针进行线性操作呢?

观察我们已经匹配上的前缀字符串,发现ABAB是对称的,也就是主串此时未匹配上的前两个字符与子串的开头两个字符时相同的,因此为了不让主串指针后移,我们选择移动子串指针,由于前两个字符相同,我们可以直接跳过前面两个字符,直接指向子串的第三个字符重新开始比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值