1、前言
首先,我們需要大致理解Kmp算法的整體思想以及大致原理,同時需要學會手算next數組的方法。這些都是很簡單並且容易理解的,本文不再贅述,如對以上內容仍有疑問,推薦一個B站視頻講解:BV1jb411V78H
另外本文的所有圖片出處:B站視頻 BV16X4y137qw
2、代碼
以下是本文講要分析的Kmp算法中關於next數組的生成部分的代碼(C語言實現):
void get_next(char ch[], int length, int next[]){ //length為串ch的長度
next[1] = 0;
int i = 1, j = 0; //i為當前主串正在匹配的字符位置,也是next數組的索引
while (i <= length){
if (j == 0 || ch[i] == ch[j])
next[++i] = ++j;
else //匹配失敗的情況要進行回溯
j = next[j];
}
}
3、分析的准備——跟着代碼走一遍邏輯
分析的例子:


4、分析的核心——背后的核心原理
1、next[j+1]
的最大值為next[j]+1
2、如果有
,那么next[j+1]
可能的次大值為next[next[j]]+1
,以此類推即可求出next[j+1]
(這是kmp算法的重點)
5、分析的深入——再以泛化的方式重新思考代碼流程

6、圖解分析
1、假設我們要求next[j+1]
,其中k+1=17

2、假設已知next[16]=8
,則元素的有以下的關系:P8 = P16
,則明顯有next[17]=8+1=9

3、如果P8和P16不相等,又若next[8]=4
,則有如下關系(這也就是第5部分中的提到的四段重合,Kmp算法理解的核心我認為就是對這部分的四段重合的理解)
