一语道破KMP算法计算next数组中k=next[k]的理解

先上定义:主串和模式串

免得后面的沟通理解有出入。

首先,要理解KMP算法的核心思想:为什么要算next[]数组?数组中每个元素表示什么意思?

核心思想就是模式串的某个元素(设为t[i])前的k个元素和该串开头k个元素分别相同,因此如果在模式串的t[i]处匹配失败,模式串的指针没必要完全回溯,只需要回溯到t[k]即可,这样一来主串指针也不用回溯了。而我们用数组就是要记录t[i]位置对应的k值,next数组中每个元素就表示模式串对应位置的前面有k个元素与开头元素分别相等。

如果理解了上边这个(当然也可能是我表达的不清楚),也就是理解了KMP算法的核心,就可以理解算法中计算next数组的k=next[k]这条语句了,用一句话概括就是:

计算next数组的函数本质上是开头k个元素组成的串与整个串的模式匹配的过程!匹配结果就保存在next数组中(i元素前面k个字符和开头k个字符匹配成功,保存为next[i]=k)。

也就是说计算next数组的函数本质上是用KMP算法计算的!而k = next[k],本质上是一个指针回溯,就是KMP算法中的模式串的指针回溯。

这就有意思了朋友们,我们就是要计算next数据来进行KMP算法的,你现在跟我说计算next数组要用到KMP算法?套娃吗

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值