KMP优化

KMP优化

KMP算法是有优化版本的,之前写过文章简单的讨论了基本的KMP算法思想,但是对于一些含有连续重复字符的字符串,会出现多次冗余的比较。
例如:字符串S=“aaababa”和模式串P=“aaac”比较时,会出现多次的不必要的比较,这个我会在下面细说。


Next数组重定义

我们首先要解决的问题就是next数组的意义,之前的我写的KMP文章里面,next数组的意义是:字符串真子串中既是前缀串同时又是后缀串中最长的那个子串的长度。例如还是模式串P=“aaac”,其对应的next数组值为:

子串 a aa aaa aaac
next[] 0 1 2 0

为了优化KMP,我们要换一种写KMP代码的思路,参考网上的代码及next数组的定义,我们首先就是需要重新改变一下next数组,我们现在定义next[i]为:表示匹配串在i处如果匹配失败下次移到的位置。 如果第一个字符就匹配不成功,那么没有地方移动,我们就定义next[0] =-1.

于是模式串P=“aaac”对应新的next数组为:(不考虑优化)

子串 a aa aaa aaac
next[] -1 0 1 2

相当于把之前的next数组整体向右移了1位,并在开始处加入-1,重新定了next数组之后,我们的KMP算法该怎么写呢?如下:


                
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值