本文适合对kmp算法有一定基础的读者,且重点说明next数组求法
一,对几个概念需申明
概念I:字符串的前缀,后缀
例:Str = "abcabc"
Str的前缀 {a,ab,abc,abca,abcab}
Str的后缀 {c,bc,abc,cabc,bcabc}
故 Str的最长公共前后缀 = abc
概念II:next数组
next[i] = j 指长度为i-1的字符串最长公共前后缀为j,即String[0,1,..,j-1] == String[i-j,i-j+1,..,i-1]
Str的next数组
next[0] = -1 //初始为-1
next[1] = 0
next[2] = 0 /// String[0-1] = {ab} 最长公共前缀后缀长为0
....
next[5] = 2 /// String[0-4] = {abcab} 最长公共前后缀为2
二,求next数组
初始next[0] = -1
怎么由 next[j] = k推出next[j+1]的值?
next[j] == k:指在模式串中 {Str(0),Str(1),...,Str(k-1)} =