KMP算法(Knuth-Morris-Pratt算法)是一种在文本字符串中高效查找子串(模式串)出现位置的算法。它避免了最简单的暴力匹配方法中的大量回溯,通过构建一个next数组(或者称为“部分匹配表”)来指导匹配过程。
我看了网上很多人的方法,感觉都没有把next数组该如何求解的问题说明白。因此,我在仔细钻研了王道还有数据结构等教材后,总结出了下面的求解方法。
Next数组构建方法:
公式:next[j]=前后缀最长公共子序列长度+1
规定:第一个和第二个元素的next值分别为0、1
例题1
看下图的例子,求解子串【abcac】的next数组:
第一步:
由规定前两个值分别为0、1,我们直接看第三个字符【c】,字符【c】之前的串为【ab】
前缀:【a】
后缀:【b】
没有最长公共子序列,因此前后缀最长公共子序列长度:0
next[3]=0+1=1
第二步:
我们看第四个字符【a】,字符【a】之前的串为【abc】
前缀:【a】,【ab】
后缀:【c】,【bc】
没有最长公共子序列,因此前后缀最长公共子序列长度:0
next[4]=0+1=1
第三步:
我们看第五个字符【c】,字符【c】之前的串为【abca】
前缀:【a】,【ab】,