最近刷题过程中发现很多博主对于kmp讲的十分透彻但是文章冗长太抽象不那么浅显易懂,本文基于优化的角度试图让大家学懂kmp这个算法是什么样的一个机制。已经对此有所了解的建议直接从匹配机制开始看,如果追求思路的连贯性,想了解这个算法的来龙去脉,还是建议从头开始看。全文无废话,action!
目录
kmp算法简介
KMP算法是三位学者在 Brute-Force算法的基础上同时提出的模式匹配的改进算法。Brute- Force算法在模式串中有多个字符和主串中的若干个连续字符比较都相等,但最后一个字符比较不相等时,主串的比较位置需要回退。KMP算法在上述情况下,主串位置不需要回退,从而可以大大提高效率。
kmp算法解决的是什么问题
先来看一个示例1.1:
分析:本题要求解决的是给出一个模式串S,在给出一个模板串P,要求你在S中寻找看看有没有包含字符串P,如果找到了就返回P在S中的开始位置。找不到可以选择输出-1,或者选择不输出。
P在S中可能不止匹配一次,P有可能在S中多次匹配成功,此时需要输出多个P的首地址,这也是下面这段暴力解法代码中j==n时让j回到1的解释。
这题思路乍一看很简单,使用暴力做法很多人都可以写出来,将i定为指向s字符串的指针,j定为指向p字符串的指针,以{s:acaba ,p:aba}为例图解思路如下(这里假定N为一个很大的数,m为字符串p的长度,n为字符串s的长度):
图解c++代码描述如下:
char p[N],s[N];
int m,n;
for(int i=1;i<=m;i++) /*主串从第一个字符开始与模板串匹配,遇到与模板串不匹配则i往后移一位*/
{
for(int