其实这是两年前我自己写的一篇总结,最近复习算法又给翻出来了,顺便发到博客上来。
从我个人的学经历来看,学习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

最低0.47元/天 解锁文章
10万+





