KMP算法的理解

kmp算法的核心是理解next数组的含义。

next数组规则如下:
注意,下标 j 从 1 开始,到最后一个字符结束 ( 也可以是 0 ,但是其他值都减 1 ) \color{red}注意,下标j从1开始,到最后一个字符结束(也可以是0,但是其他值都减1) 注意,下标j1开始,到最后一个字符结束(也可以是0,但是其他值都减1)

  1. next[j] = 1 , j = 1
  2. 满足如下条件的k的最大值:
    n e x t [ j ] = { m a x ( k ) ∣ 1 < k < j , p 1 . . . p k − 1 = p j − k + 1 . . . p j − 1 } 。 其中 0 < p 1 ≤ p k − 1 , 0 < p j − k + 1 ≤ p j − 1 。 next[j] = \{max(k) \quad | 1<k <j,p_1...p_{k-1} = p_{j- k + 1}...p_{j-1}\}。\\其中0<p_1 \le p_{k - 1}, 0 < p_{j-k+1} \le p_{j - 1} 。 next[j]={max(k)∣1<k<j,p1...pk1=pjk+1...pj1}其中0<p1pk1,0<pjk+1pj1
  3. next[j] = 1,其他情况。

查找时,若在主串中找到模式串的部分匹配,为了不回退主串中的比较指针,从而提高查找/比较速度,从而采取的优化措施。特别是在模式串比较长,比如超过几十个字符,并且模式串中出现重复的前缀和后缀时,kmp算法能极大提高速度,模式串中:模式串越长并且前后缀匹配越长,算法的时间复杂度提升越明显。

比如字符串"abaabcac"的next数组为:111223121

至于改进的next数组,情况将会更加复杂。

关于卡特兰数,暂时只需要记忆如下公式,推导暂且不提:

C 2 n n n + 1 \frac{C_{2n}^{n}}{n+1} n+1C2nn

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值