一直以来都对字符串匹配 kmp 算法的理解模棱两可,今天经过一个多小时的钻研算是有了比较深入的理解,顺便在这里记录一下。
这里主要记录一下 kmp 算法中 next 数组的求法。
简单地说,对于模式串的某一位置 j
,next[j]
的值是该模式串从下标 0
到 j - 1
的子串最大相等前缀与后缀数,下面举个例子加以说明。模式串 pattern
及其对应的下标如下图所示:
位置 0
上的元素 a
前面没有子串,因此这里我们令 next[0] = -1
;
位置 1
上的元素 b
,它前面的字符串为 a,字符串 a 没有最大相等前缀和后缀(注意:最大相等前缀后缀不包括自身),因此 next[1] = 0
;
位置 2
上元素的 a
, 它前面的字符串为 ab
,字符串 ab
没有最大相等前缀和后缀,因此next[2] = 0
;
位置3
上元素的a
, 它前面的字符串为aba
,字符串aba
的最大相等前缀和后缀为a
,因此next[3] = 1
;
位置4
上元素的b
, 它前面的字符串为abaa
,字符串abaa
的最大相等前缀和后缀为a
,因此next[4] = 1
;
位置 5
上的元素 c
, 它前面的字符串为 abaab
,字符串 abaab
的最大相等前缀和后缀为 ab
,因此 next[5] = 2
;
位置 6
上的 元素a
, 它前面的字符串为 abaabc
,字符串 abaabc
的没有最大相等前缀和后缀,因此 next[6] = 0
;
位置 7
上的 元素b
, 它前面的字符串为 abaabca
,字符串 abaabca
的最大相等前缀和后缀为 a
,因此 next[7] = 1
;
位置 8
上的 元素a
, 它前面的字符串为 abaabcab
,字符串 abaabcab
的最大相等前缀和后缀为 ab
,因此 next[8] = 2
。
通过以上步骤,我们便可得到整个next
数组的值,其余pattern
的对应关系如下:
那么我怎么通过代码来实现对next
数组的求解呢,这里给出next
的递推关系。对于模式串的位置j
,有next[j] = k
,例如取j = 4
,则有next[4] = 1
;则对于模式串的位置j + 1
,有以下两种情况:
若