数据结构 - KMP算法

目的: 求next数组 和 nextval数组

方法:

       maxL: PM比较时, 比较前缀和后缀相同的个数

       过渡:去除最后一个值,开头加负一,整体右移

       next:在过渡的基础上 每个都加一

      nextVal:检查maxL和next是否相等 。 不相等填入next值,相等取next对应序号的nextVal

ps:重点在 maxL比较 前后缀的比较

如: ababa   前缀 a,ab,aba,abab

                     后缀 a,ba,aba,baba

可以看到 前缀 后缀 取交集 为 a,aba

同时取最大的数量 即为aba  此处为 3 

KMP算法:

给定一个主串S及一个模式串P,判断模式串是否为主串的子串;若是,返回匹配的第一个元素的位置(序号从1开始),否则返回0;

这里先不写算法,仅仅计算next和nextVal值

那么计算时只用到子串,也就是模式串

这里模式串为:abaabcac

第一步将模式串写上序号,我们这里从1开始(有的从0开始,建议充1开始)

 然后计算出maxL值,列出从第一个开始的子串,找出相等的前缀和后缀的个数

如果2>看不懂的话,看3>,

2>计算maxL值

所以maxL值

 如果这个看不懂的话, 看下面的3>

3>, 如果2>看懂了这个就不用看了

 依次类推

4>计算next值

接下来将maxL复制一行,去掉最后一个数,在开头添加一个-1,向右平移一个格,然后每个值在加1的到next值

 5>计算nextVal值,首先将第一个为0,然后看next和maxL是否相等(先计算不相等的)

当next和maxL不相等时,将next的值填入

当next和maxL相等时,填入对应序号为next值得nextVal值

 

 

 所以整个nextVal值为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值