Knuth–Morris–Pratt Algorithm
KMP 算法
最大子串的概念
• 所谓真子串是指模式串t存在某个k(0<k<j),使得
“t
0
t
1
…t
k-1
”
= “ t
j-k
t
j-k+1
…t
j-1
”成立。
t
0
t
1
…t
k-1
t
j-k
t
j-k+1
…t
j-1
t
j
j 0 1 2 3 4 5 6 7 8
t[j] A B A C A B A B C
next[j] -1 0 0 1 0 1 2 3 2
所有真子串中最长的称为最大子串,其长度k记为next[j]
?
?
?
目标串
模式串
目标串
模式串
i: 01234567890123456789012
S: ABC_ABCDAB_ABCDABCDABDE
t: ABCDABD
j: 0123456
j 0 1 2 3 4 5 6
t[j] A B C D A B D
next[j] -1 0 0 0 0 1 2
i: 01234567890123456789012
S: ABC_ABCDAB_ABCDABCDABDE
t: ABCDABD
j: 0123456
i: 01234567890123456789012
S: ABC_ABCDAB_ABCDABCDABDE
t: ABCDABD
j: 0123456
i: 01234567890123456789012
S: ABC_ABCDAB_ABCDABCDABDE
t: ABCDABD
j: 0123456
i: 01234567890123456789012
S: ABC_ABCDAB_ABCDABCDABDE
t: ABCDABD
j: 0123456
i: 01234567890123456789012
S: ABC_ABCDAB_ABCDABCDABDE
t: ABCDABD
j: 0123456
i: 01234567890123456789012
S: ABC_ABCDAB_ABCDABCDABDE
t: ABCDABD
j: 0123456
归纳起来,定义next[j]函数如下:
max{k|0<k<j,且“t
0
t
1
…t
k-1
”=“t
j-k
t
j-k+1
…t
j-1
” }
当此集合非空时
-1 当j=0时
0 其他情况
next[j]=
j 0 1 2 3
t[j] a b a b
next[j] -1 0 0 1
t=“abab”对应的next数组如下: