BF算法与KMP算法——串(2)

博客介绍了KMP算法,其效率比BF算法提高到o(m+n),i无需回溯,j不一定从头开始,用next[j]数组存放j的位置,还解释了前缀、后缀概念,通过例子说明next值的计算,最后提到特殊情况时可根据next求nextval对next函数进行优化。

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

KMP的算法比起BF算法的效率有一定的提高,提高到o(m+n)。

此算法与BF算法不同的是i不需要回溯,j也不一定要从头开始

 i不回溯,则不用管。但j不一定需要从头开始,那么j应该回到哪个位置呢,我们用next[j]的数组来存放j的位置。

 “从头开始的k-1个元素”是指其前缀,如有一个字符串“abcd”,那么“a”,“ab”,“abc”都为其前缀,而“abcd”不是。

“j前面的k-1个元素”是指后缀,如一个字符串“abcd”,那么“d”,“cd”,“bcd”都为其后缀,但不包括其本身。

看如下例子:

 通常来说,第一个都为0(j=1),第二个都为1(前面只有一个元素,无前缀后缀,属于其他)

当j=3时,前缀a!=后缀b,则为其他情况,next=1;

当j=5时,前缀a==后缀a,但ab!=ca,则为2;

如此依次类推。

代码如下:

 

当遇到如下特殊情况时next函数可以进行改进:

 

 因为字符都为a,都不能与b进行匹配,所以可以进行优化。

可以根据next求nextval,如:第三位a的next为1,则用第三位与第一位比较(next是多少就与第几位比较),相同为0,不同就为next的值

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值