【5分钟图解秒懂一个算法---kmp】

本文深入浅出地介绍了KMP算法,包括它的起源、解决的问题及匹配机制。通过实例分析,揭示了KMP算法如何避免暴力匹配中的无效比较,通过next数组实现快速跳转,提高搜索效率。适合对算法感兴趣的读者学习。
摘要由CSDN通过智能技术生成

最近刷题过程中发现很多博主对于kmp讲的十分透彻但是文章冗长太抽象不那么浅显易懂,本文基于优化的角度试图让大家学懂kmp这个算法是什么样的一个机制。已经对此有所了解的建议直接从匹配机制开始看,如果追求思路的连贯性,想了解这个算法的来龙去脉,还是建议从头开始看。全文无废话,action!

目录

kmp算法简介

kmp算法解决的是什么问题

kmp匹配机制

next数组--保存字符串前后缀匹配最长的位置


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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值