KMP算法

59 阅读2分钟

 KMP算法是通常用来解决一个字符串(模式串)在另一个字符串(文本串)里出现的位置的问题。

实现KMP算法核心首先是要先得到当前模式串的next数组。

这里的next[i]表示的是以第i个字符为结尾的子串的最长相等的前缀和后缀的长度。

然后在模式串p和文本串s进行匹配的时候,如果s[i]!=p[j+1],并不是将p向后移动一位,而是向后移动到下一次可以和i匹配的地方,也就是ne[j];

首先我们先来模拟求取ne数组的过程。根据定义我们可以知道ne[0]=ne[1]=0,所以我们求解ne数组的时候就从2开始求。

这里的话和两个串直接匹配的方法很类似,就不再多说了,可以自己拿一个串做一个推理。

做kmp的时候,j一般都是从0开始的,所以我们每一次都是拿i和j-1进行比较。

​编辑

主要还是说一下自己对kmp算法主体的理解。

首先这个时候已经预处理出来ne数组了,然后我们就开始匹配。

​编辑

假设s[a:i-1]已经和p[1:j]全都匹配上了,但是s[i]!=p[j+1],如果这个时候我们使用的是暴力的做法的话,应该是把j++;然后继续进行匹配,但是因为我们已经得到了以第i个结尾的子串的最长公共前后缀长度,也就是说这个时候的p[1:ne[j]]和p[j]之前的某一段是匹配的,也就是和s[i-1]之前是有匹配的,我们可以直接从p[ne[j]]h和s[i]进行匹配就可以。然后后面就一直重复这个步骤,直到找到这个串,也就是j==m。

现在写这个算法,一方面是因为自己马上要考研了,开始复习数据结构,另一方面也是之前学的算法太不扎实,没有注意总结与思考,马上要退役了,尽量让自己清醒一点,再清醒一点。