轻松搞定KMP算法

博客探讨了如何有效地计算KMP算法中的next数组,这是解决字符串匹配问题的关键步骤。通过理解next数组的构造,可以深入掌握KMP算法的精髓。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于字符串的匹配,也就是查找是否在主串中包含一个特定的子串,我们能想到的最简单直观的算法就是BF算法。
在BF(Brute Force)算法中,我们的处理方式是:
1.先在主串中找到一个字符跟子串的第一个字符相同
2.如果是在主串的位置i上找到了这个字符,然后主串和子串依次向后移动,对子串剩下的字符串进行匹配。如果匹配成功则返回位置i。
3.否则从位置i的下一个位置开始,继续重复步骤1,找那个跟子串第一个字符匹配的那个位置,然后再进行匹配。
4.如果一直到主串的末尾都没匹配成功说明匹配失败。
例如:
主串:
a b c d  f e g c d  f    e    t
1 2 3 4 5 6 7 8 9 10 11 12
子串:
c d f e t
1 2 3 4 5
在这个例子中,我们可以看到,最终匹配成功的位置应该是8
首先我们在主串位置3成功匹配首字符,接下来到位置7的时候匹配失败了。因为主串是g,子串是t。不匹配。
按照BF的思想,我们应该从位置3的下一个位置也就是d继续匹配首字符。
但是重点来了,你是否发现一个问题,这里面我们从3的下一个位置开始匹配首字符其实是多余的。为什么呢,因为从位置3的c到位置7的g中间没有另外一个c能够让我们成功匹配首字符。主要原因是子串中没有跟首字符重复的字符出现过,注意一定是首字符。那么原因就显然易见了,因为子串从c到e一直是和主串匹配的,而子串中c到e又没重复出现过c,所以在主串中,c到e也一定不会匹配到一个c,所以从d开始匹配是多余的。实际上我们从失配的那个字符开始重新匹配就行了,也就是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白话机器学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值