[KMP算法]蛮力法求next[]与“省力”法求next[]

本文详细介绍了KMP算法中next[]数组的构造,包括蛮力法和“省力”法。通过分析模式串的最长前后缀,减少串匹配中的回溯,提高效率。KMP算法的关键在于预处理next[],使得在遇到不匹配时能快速调整模式串位置。文章提供了具体的例子和Java代码来阐述这两种方法。

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

KMP算法可用于“串匹配”问题。

用单纯的蛮力法进行串匹配的时候,只是在无脑回溯待匹配串与模式串(详细的不说了),当然这也是解决“串匹配”问题时最直接的想法

但KMP算法的思想,却省去了待匹配串与模式串的回溯,遇到不匹配的字符,模式串选择的是向后移动(其实效果等同于模式串当前不匹配字符的下标回溯到前面的某个位置),从而缩短了时间复杂度。

KMP算法之所以减少了时间复杂度,关键在于之前对于模式串有效的分析,找到模式串中“隔三差五”出现的相同字符或子串,并将其记录到next[]中,一旦遇到不匹配的字符,则将模式串向后移动到上一次出现相同的字符或字符串的位置。(更详细的解说其他人的博客中有,下面是链接KMP算法

我这里重点记录一下2种求next[]数组的方法(怕以后自己忘了……)

next[]数组中记录的是模式串中在位置i处相等的前缀与后缀的长度

例如"abcab",next[0]代表子串"a",next[1]代表子串"ab",next[2]代表"abc",next[3]代表"abca",next[4]代表"abcab"

a,只有一个字符,不存在前缀与后缀之分,因此next[0] = 0;

ab,前缀{a},后缀{b},不存在相等的前后缀,因此next[1] = 0;

abc,前缀{a,ab},后缀{bc,c},不存在相等的前后缀,因此next[2] = 0;

abca,前缀{a, ab, abc},后缀{bca, ca, a},存在最长相等的前后缀a,长度为1个字符,因此next[3] = 1;

abcab,前缀{a, ab, abc, abca},后缀{bcab, cab, ab, b},存在最长相等的前后缀ab,长度为2个字符,因此next[4] = 2;

所以next[]数组中的值分别为{0, 0, 0, 1, 2}

下面来看实际中的例子:

待匹配串 s = "abcacababcab";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值