不同版本的KMP算法总结

其实这是两年前我自己写的一篇总结,最近复习算法又给翻出来了,顺便发到博客上来。
从我个人的学经历来看,学习KMP算法最大的困难在于版本太多。如果你看完一个博客只是懵懂,想再看看另一个博客,那么就很有可能遇到另一个版本的KMP算法,会让你更加混乱,所以我觉得整理一下KMP算法的不同版本其实更加重要。
不同版本KMP算法的主要流程其实都是相似的,其不同之处在于预处理数组的定义。

第一种KMP算法的预处理数组叫做LPS数组(longest proper prefix which is also suffix),其中proper prefix是指不包含字符串本身的前缀(A proper prefix is prefix with whole string not allowed)。上述定义是从GeeksforGeeks中截取的,和它定义相同的参考书为《算法导论》。用中文解释的话,LPS[i]存储的是模式串前i+1个字符所组成的子串中,最大的相同前后缀。例如,字符串ababaca的LPS数组如下:

i 0 1 2 3 4 5 6
前缀 a ab aba abab ababa ababac ababaca
LPS[i] 0 0 1 2 3 0 1

第二种KMP算法的预处理数组叫做next数组,也是网上博客提到最多的一种。不过next数组又要分两种:一种是K、M、P

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值