KMP算法
KMP 算法主要由两部分组成
- 前缀函数
- 匹配
前缀函数(Prefix function) KMP的next函数
前缀函数是KMP
思想的精髓
前缀函数的功能是求出模式串的next[]数组。那么,什么是模式串?什么是next数组?
举个栗子:
“给出一个字符串T
,再给出n
个字符串S1
、S2
、…、Sn
,问S1
、S2
,…,Sn
中有哪些是T
的子串?”
在这个例子中,S1
…是n
个模式串,T
是被匹配串。模式串是用来与被匹配穿匹配的。
那么 next[]
数组又是干什么的呢?这个next[]的概念就是前缀数组的精髓,KMP思想中精髓的精髓。
用一句话概括:
如果模式串P的前i个字符组成的子串为S
,那么S
的前next[i]个字符
与S
的后next[i]
个字符相同
举例:
模式串P为ababaaab
。next[5]的值为3。这说明P的前5个字符组成的字符串**ababa
**的前3
个字符与后3
个字符相同,均为aba
。
代码模板
1 | /* |
KMP的匹配
匹配部分主要依托next[]
数组进行。其原理还是用一句话概括:
当被匹配穿的第i
个字符T[i]
与模式串的第j个字符不匹配时,将转而与模式串的第next[j-1]+1
个字符匹配。
算法模板
1 | void COMPUTE_PREFIX_FUNCTION(char P[]) |
使用模板