Written with StackEdit.
由于CSDN服务器的维护,我迫不得已地用了和CSDN版本相近的StackEdit
KMP
算法,是一种字符串匹配的算法。当然,我们已经学过了一两种字符串匹配算法,先来稍微回顾一下。
首先是暴力匹配,也就是将串中每一个长度等于另一串的子串和另一串进行匹配。若两串的长度为
n
和
然后是哈希。哈希在本质上是一种概率算法,实际上是采用了一种映射的方法,如果将所有被哈希之前的字串的集合设为
A
,而被哈希之后的字串的哈希值集合设为
好吧,回顾完了,我们来稍微了解一些关于
KMP
的东西。
KMP
的本质是暴力匹配的优化,而其有一个较为简单的版本,
MP
。本文介绍时将先介绍
MP
算法,再比较
KMP
与
MP
之间那一个
′K′
的不同。
考虑暴力算法,其思路大致是用指针
i
和
但是,这样单纯地找,有时是不会有好结果的。如下所示,两个串
A
和
其中,若在串 A 中找串
MP 算法正是基于这样的一种思想。倘若存在某个 [1,j]=[i−j,i] ,那么我们定义 j=next(i) ,表示当在 i 位置的字符失配时应当跳到哪里。其的求法我们先不管,但是这样一来匹配就很好写了,代码这里略去,请自行查找资料。
那么,
这,就是 MP 算法的全套,至于 KMP 算法,请自行查阅资料。