[学习笔记] KMP算法的Next数组怎么求

首先定义一个概念:

字符串:不定义了。

前缀pre(i):S[1...i]。后缀记为suf(i):S[i...1]。

子串:略。

Border:如果在字符串S中,存在一个前缀等于它的后缀,就称这个前缀是这个字符串的一个Border。

(PS:不允许选择整个串)

显然一个字符串可能有若干个Border。

记一个字符串中的最长的Border为LBorder。

特别的,我们把S的一个前缀的LBorder记为LBorder(i)

考虑怎么计算每个前缀的LBorder。

首先,LBorder(1)=0。这是废话。

然后假设我们已经把1~(i-1)的LBorder算出来了。

考虑现在计算LBorder(i),假设第i个字符是c。

然后考虑,如果LBorder(i)>0,那么把字符c去掉后,一定是i-1的一个Border。

因此我们可以枚举i-1的所有Border,找到其中最长的一个满足其后面的字符为c的Border。

如何找到i-1的所有Border呢?

我们注意到,串S的Border,要么是LBorder,要么是LBorder的一个Border。

因此每次令j=Border(j)就可以枚举到所有的Border。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值