【字符串】 KMP算法小结(通俗易理解)

[KMP算法]最简单通俗易懂求next数组的方法 什么是KMP算法 KMP算法又称看毛片算法,是用来进行字符匹配的,比如要检查一个字符串S[]里是否有字符串P[],如果用暴力算法的话,也是可以解的,但是效率特别低,时间复杂度为O(m*n),而如果你用看毛片算法的话,时间复杂度为O(m+n)。 本文先单独讲述kmp算法中一个重要的数组——next[]数组的求法,如果一个字符没有匹配成功,那么进行查询next数组将指针回溯,也可以理解成将目标数组往后... 阅读详情

1. 暴力匹配算法


    假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?

    如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:

  • 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符;
  • 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为0。
    理清楚了暴力匹配算法的流程及内在的逻辑,咱们可以写出暴力匹配的代码,如下:
  1. int ViolentMatch(char* s, char* p)  
  2. {  
  3.     int sLen = strlen(s);  
  4.     int pLen = strlen(p);  
  5.   
  6.     int i = 0;  
  7.     int j = 0;  
  8.     while (i < sLen && j < pLen)  
  9.     {  
  10.         if (s[i] == p[j])  
  11.         {  
  12.             //①如果当前字符匹配成功(即S[i] == P[j]),则i++,j++      
  13.             i++;  
  14.             j++;  
  15.         }  
  16.         else  
  17.         {  
  18.             //②如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0      
  19.             i = i - j + 1;  
  20.             j = 0;  
  21.         }  
  22.     }  
  23.     //匹配成功,返回模式串p在文本串s中的位置,否则返回-1  
  24.     if (j == pLen)  
  25.         return i - j;  
  26.     else  
  27.         return -1;  
  28. }  

    举个例子,如果给定文本串S“BBC ABCDAB ABCDABCDABDE”,和模式串P“ABCDABD”,现在要拿模式串P去跟文本串S匹配,整个过程如下所示:

    1. S[0]为B,P[0]为A,不匹配,执行第②条指令:“如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0”,S[1]跟P[0]匹配,相当于模式串要往右移动一位(i=1,j=0)

    2. S[1]跟P[0]还是不匹配,继续执行第②条指令:“如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0”,S[2]跟P[0]匹配(i=2,j=0),从而模式串不断的向右移动一位(不断的执行“令i = i - (j - 1),j = 0”,i从2变到4,j一直为0)

     3 . 直到S[4]跟P[0]匹配成功(i=4,j=0),此时按照上面的暴力匹配算法的思路,转而执行第①条指令:“如果当前字符匹配成功(即S[i] == P[j]),则i++,j++”,可得S[i]为S[5],P[j]为P[1],即接下来S[5]跟P[1]匹配(i=5,j=1)

     

     4 . S[5]跟P[1]匹配成功,继续执行第①条指令:“如果当前字符匹配成功(即S[i] == P[j]),则i++,j++”,得到S[6]跟P[2]匹配(i=6,j=2),如此进行下去

    

    5. 直到S[10]为空格字符,P[6]为字符D(i=10,j=6),因为不匹配,重新执行第②条指令:“如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0”,相当于S[5]跟P[0]匹配(i=5,j=0)

     

     6 . 至此,我们可以看到,如果按照暴力匹配算法的思路,尽管之前文本串和模式串已经分别匹配到了S[9]、P[5],但因为S[10]跟P[6]不匹配,所以文本串回溯到S[5],模式串回溯到P[0],从而让S[5]跟P[0]匹配。

    而S[5]肯定跟P[0]失配。为什么呢?因为在之前第4步匹配中,我们已经得知S[5] = P[1] = B,而P[0] = A,即P[1] != P[0],故S[5]必定不等于P[0],所以回溯过去必然会导致失配。那有没有一种算法,让i 不往回退,只需要移动j 即可呢?

    答案是肯定的。这种算法就是本文的主旨KMP算法,它利用之前已经部分匹配这个有效信息,保持i 不回溯,通过修改j 的位置,让模式串尽量地移动到有效的位置。



2. KMP算法


首先声明要搜索的串为S,设长度为n,要匹配的串为M,设长度为m.

先考虑暴力的算法,暴力的算法是遍历S的每一个字符,然后从这个字符开始和M串进行匹配。时间复杂度为O(nm).

怎么在此基础上进行优化?假设现在从某个位置(设为s)开始和M串进行匹配,如果匹配不成功,暴力算法是从这个位置的下一个位置(s+1)进行匹配,直观上来说就是匹配的字符串向后“滑动”了一位。

image

图1

能不能想办法让M向后移动的距离最大化?考虑最好的情况,如果和M匹配的S中的m个字符和M中的字符没有一个相等,那么能向右移动m位;考虑最坏的情况,比如上图,只能移动一位。

而KMP就是在这里做文章,让M串向后“滑动”的距离最大化。

image

图2

考虑上面的图,M中灰色部分已经和S的灰色部分匹配上了,而灰色部分后一个字符不匹配,则现在M要向后滑动,假设一直向后滑动,直到如图位置又和S再一次匹配上了,那么从这里我们可以得到如下的结论:

  • A段字符串是M的一个前缀。
  • B段字符串是M的一个后缀。
  • A段字符串和B段字符串相等。

这样,如果暂时不考虑S,只看M的话,假设已经匹配的M的字串(即图中M中灰色部分)为subM,则subM有个【相等】的【前缀】和【后缀】。而且M在遇到不匹配的时候可以直接滑动到使subM的前缀和subM的后缀重合的地方。而M向后滑动的时候,第一次subM的前缀和后缀重合意味着此时这个相等的subM的前缀和后缀的长度是最大的。

我们的任务就是要寻找subM的最长的前缀和后缀相等的串。

知道了这一点,离KMP的真谛也就不远了。现在结合这上面的图模拟一下KMP算法的整个流程:

  • 将S串和M串从第一个字符开始匹配;
  • 如果匹配成功,则subM即灰色部分增加;
  • 如果不成功,则M向后滑动使滑动后的subM的前缀和滑动前的subM的后缀重合,再进行匹配,如果还不成功,则再次滑动M,直到匹配成功或者M滑动到X处。如果到了X处,则从M串的起始位置进行匹配。

从上面的步骤可以知道,KMP的关键就是要知道当S串中的字符和M串中的字符不匹配时,S串要和M串中的哪个字符继续进行匹配。这个就是在利用状态机模型来解释KMP算法时的状态转移.

KMP是通过一个定义了一个next数组,这个next数组保存了如果S中的字符和M中的字符不匹配时S要和M中的哪个字符重新进行匹配的坐标值。如图2中所示是例子,S中的X位置和M不匹配了,那么S要和M中A段后面的字符进行比较,从图中来看是M向后滑动了。

换句话说,next[i]总是保存了当M[i]不匹配时要从M[next[i]]处进行匹配,这个M[next[i]]可能会匹配,如果还不匹配?那么可能会在M[next[next[i]]]处匹配了。这里同时隐含着一个信息,就是i之前的一段字符和next[i]之前的一段字符是相同的,也就是M[0…i-1]相等的前缀和后缀。

现在考虑next[0],next[1]…next[i]都已经知道了,那么图示如下:

image

设j=next[i],灰色部分表明这两段字符是相等的,如果i位置的字符和j位置的字符相等,那么next[i+1]=j+1;因为前一段灰色部分和j位置的字符组成的字符串和后一段灰色的与i连接所形成的字符串是相等的。这正是前面对next数组的定义。如果不相等,则要找到从i开始包括i往前的一段字符串与从0开始的一段字符串相等,这样形成相等的前缀和后缀。所幸我们知道next[next[i]]的值,因为next[i]前面的字串也有最长的公共前缀和后缀,而这个公共的前缀与现在i以及往前形成的字串可能相等,这样一直向前找,如果找不到,则说明i位置的字符从来没有在之前出现过。

这样求出来的next数组其实是从下标1开始的,因为下标0之前是个空串,下标1则对应着M串的第0个字符。我们设next[0]=-1,仅仅是个标志而已,没有什么特殊的含义。

那么根据前面所述,可以很容易的写出初始化next数组的代码

void kmpGetNext()
{
    int i=0, j=-1;
    b[i]=j;
    while (i<m)
    {
        while (j>=0 && p[i]!=p[j]) j=b[j];
        i++; j++;
        b[i]=j;
    }
}

知道了next数组的值,则和S串进行匹配则相对简单了,因为如果碰到不匹配的时候去查找next数组即可,直到找出和当前字符匹配的那个字符。如果找不到怎么办?找不到则会得到-1,也就是没有字符和他进行匹配,那么跳过这个字符,直接从下一个字符进行匹配即可。

代码如下:

void kmpSearch()
{
    int i=0, j=0;
    while (i<n)
    {
        while (j>=0 && t[i]!=p[j]) j=b[j];
        i++; j++;
        if (j==m)
        {
            report(i-j);
            j=b[j];
        }
    }
}

看到上面的代码,两层循环,貌似这个代码并不是线性的,其实不然。外层循环了n次这个没有问题,关键是里面的while循环,这个循环的次数是多少并不好确定,然而考虑单单考虑j的值的变化,会发现第七行j增加1,而第6行j则减少,可能减少1,可能减少2,可能少的更多,但是j<0时循环就终止了,也就是说j有n次增加的机会,会有多少次减少的机会?或者问j最多减少多少次?j减少的次数最多的时候,就是每次减少1,这样最多的会减少n次,也就是说第六行的循环最多会执行n次。平摊到每个循环,则执行次数为O(1),所以kmpSearch的时间复杂度仍然是线性的O(n),同理,kmpGetNext的时间复杂度为O(m).详情请参考matrix67大牛的文章,下面有犀利的评论:

倒数第七段

“…每一次执行while循环都会使j减小(但不能减成负的),而另外的改变j值的地方只有第五行。每次执行了这一行,j都只能加1;因此,整个过程中j最多加了n个1。于是,j最多只有n次减小的机会(j值减小的次数当然不能超过n,因为j永远是非负整数)。这告诉我们,while循环总共最多执行了n次。… ”

这里不大明白,整个过程中j是在回退然后前进的,假设第一遍比较回退一次,第二遍比较回退两次,于是总共加起来j减小和变大的次数都要大于n,不是吗?

回复:我每年新交1个MM,我100年内会失恋200次吗?

PS: http://chaoswork.com/blog/2011/06/14/kmp%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/

KMP算法—最通俗易懂的讲解! 引言 我们把寻找字符串A(模式串)在字符串B(主串)第一次完整地出现的位置,把这个过程叫做字符串匹配,例如下图: 在这种模式匹配中,最粗暴简单的方法: 开始之前记个k=0作为匹配失败的次数,i作为模式串比较字符的位置,j作为主串比较字符的位置; 匹配成功时,接续向下一个字符进行匹配,直到匹配模式串匹配完成; 当发现匹配失败时,模式串重新到首个字符,而主串则回溯到k+1的位置,k自加1; ... 阅读详情

相关推荐

SAP采购信息记录批量维护实战:用BAPI ME_INFORECORD_MAINTAIN搞定价格等级和条件记录

本文深入解析SAP标准BAPI ME_INFORECORD_MAINTAIN在采购信息记录批量维护中的应用,特别聚焦价格等级和条件记录的技术难点。通过实战案例和代码示例,帮助用户高效处理供应商-物料价格数据,提升供应链管理效率。

weixin_42522320的博客 410

关于KMP及其改进的思考

(1)首先推荐我见过的最好的KMP算法详解(转载自知乎:https://www.zhihu.com/question/21923021/answer/281346746): 有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍。但KMP算法真的不适合这样去学。最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉。我试着从这个思路再介绍一下。...

weixin_39804483的博客 1564

从零到一:RT-Thread与W5500的硬件抽象层设计哲学与实践启示

本文深入探讨了RT-Thread操作系统下W5500以太网模块的硬件抽象层(HAL)设计哲学与实践。通过GD32F103和STM32F103平台的适配案例,详细阐述了如何利用RT-Thread的驱动框架实现跨平台硬件无关性、模块化设计及配置定制,为嵌入式开发者提供了可复用的HAL设计方法论和实战经验。

7z8x2c4v6b9的博客 197

KMP算法

这个算法研究了一天,从理论推导到C语言实现,作为初学者,还是不太容易,尤其很多资料对于next矩阵有的从0开始有的从1开始。作为初学者尤其是在具体实现是可能会搞混,但其实其本质是一样,首先需要理解算法的本质,然后再考虑形式上差异就会比较容易。 首先简单介绍朴素的模式匹配算法,然后详细介绍KMP算法。

2Know的博客 3710

STM32驱动HC-SR04超声波模块:两种精准测距方案详解

本文详解STM32驱动HC-SR04超声波模块的两种精准测距方案:定时器中断计数法和外部中断边沿检测法。涵盖硬件连接、代码实现与优化技巧,帮助开发者根据精度和复杂度需求选择合适方案,提升超声波测距在嵌入式项目中的稳定性和准确性。

g5h6i的博客 683

国产系统迁移实战:在银河麒麟V10上搞定Wine32位支持,让老Windows软件跑起来

本文详细介绍了在银河麒麟V10操作系统上构建Wine32位支持的全过程,帮助用户解决Windows应用迁移难题。从系统架构差异分析到Wine环境配置,再到实战应用部署与优化,提供了一套完整的解决方案,确保老Windows软件在国产系统上稳定运行。

weixin_32288959的博客 649

KMP算法问题简单思考记录

常规解决主串中查找匹配的子串的问题是通过 朴素匹配算法,简单讲,就是通过比较主串和子串的第一个字符来查找,若主串和子串的第一个字符不相同,那么主串第二个字符和子串相比较,如若相同,主串和子串再比较下一个字符,以此类推,知道比较主串中找到连续的字符 与子串相同,则结束匹配。     KMP算法呢 主要通过一个next数组记录主串中每一个子序列中最长的共有元素长度值 如(借图) -

二次元怪兽的博客 476

ollama使用CPU安装qwen-coder模型_并在eclipse中使用ai coder插件_配置本地qwen-coder模型_ollama常用操作记录---AI大模型应用探索0002

文章摘要:作者分享了在Windows 10上安装和使用Ollama模型的过程。尝试了不同规模的qwen-coder模型(7b、1.5b和0.5b),发现7b模型响应极慢(需35分钟),而1.5b模型表现较好(3秒响应)。最终选择1.5b版本用于代码开发辅助,支持多语言自动补全。同时提到在最新版Eclipse中的AIcoder配置问题。文章重点比较了不同模型规模在CPU环境下的实际使用体验和响应速度差异。

添柴程序猿的专栏 683

kmp算法--通俗易懂

今天花了好几个小时学习这个算法,担心之后忘记,所以在这里做些总结。也方便其它人学习借鉴。          学习理解的过程中也看了很多帖子,但感觉说的都不是特别清楚,也对照了课本,但是大量的推理证明并不到好理解,没有与程序结合起来讲,明明已经明白的原理在教材中还要费力理解。所以文末我会推荐一篇写的特别好的博文,希望能帮到大家。  正文: 1. kpm算法的原理        推荐网址htt

weixin_36346676的博客 532

QT5软件开发入门到项目实战PDF(配完整示例代码)(持续更新)

这是一套QT5软件开发入门到项目实战的教程,并配套了所有的案例完整代码,方便QT初学者快速入门;文章里包含了QT常用的控件使用介绍、多媒体应用、线程、网络编程、蓝牙、串口、应用发布、嵌入式设备环境部署、Android环境部署等;目前一共写了19章,627页,后续也会持续更新。

5万+

10、进化动力学谱分析中的开放性问题

本文探讨了进化动力学谱分析中的若干开放性问题,重点围绕进化算法的性能与设计理论展开。文章首先介绍了规范模型及其线性动力学特性,随后深入分析了在实际应用中偏离理想情况的两个关键因素:有限种群和双亲重组。在此基础上提出了三个核心开放性问题:寻找最优传输矩阵以实现全局最优解的高效搜索、无限与有限种群模型谱之间的关系、以及卡林定理在多遗传算子下的推广可能性。通过谱条件、快速混合性与首次命中时间的关系分析,文章进一步讨论了全局吸引与快速收敛的理论基础,并提出了未来的研究方向,包括理论深化、实验拓展与跨学科融合,旨在为

cuda7parallel的博客 80

字符串查找——朴素查找和kmp算法

        kmp算法是由三位大神容忍不了普通字符串查找方法的时间效率达到了O(n*m),因而发明的算法。它让字符串的查找达到了O(n+m)。我们可以先看看普通方法解决这个问题,为了让大家更加理解题目,我把题目的意思再表达得更清楚。        题目:我们设字符串的主串名为str,字符串的子串名为sub,我们现在想要在主串str中查找是否存在子串sub。   一、朴素查找算法

Betty2017的博客 843

第10章: MMU notifier与HMM的协作

本文摘要: HMM(Heterogeneous Memory Management)是Linux内核提供的异构内存管理框架,用于统一CPU与设备(如GPU、DSP等)的内存访问。它通过镜像页表技术实现虚拟地址空间共享,自动同步CPU和设备页表变化,支持透明的内存迁移和设备内存管理。HMM构建在mmu_interval_notifier机制上,利用序列号检测页表修改冲突,提供高效并发控制。核心数据结构包括hmm_range和HMM PFN标志位,通过hmm_range_fault()实现页表遍历和缺页处理。

图形/计算GPU的驱动与虚拟化技术分享园地 3095

KMP算法——通俗易懂讲好KMP算法:实例图解分析+详细代码注解 --》你的所有疑惑在本文都能得到解答

字符串的最长公共前后缀,部分匹配表,最长公共前后缀介绍,部分匹配表介绍,kmp算法java代码实现,匹配成功一个就退出匹配的kmp算法代码实现,允许匹配多个,可重复索引字符的kmp算法代码实现,允许匹配多个,不可重复索引字符的kmp算法代码实现,kmp算法实例分析,kmp算法图解

是谢添啊 9万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

通俗理解KMP算法

前言      因为最近在刷剑指,看到有大神用自动机,然后就研究了下,进而看了看KMP算法,但是很多资料感觉太啰嗦,看起来着实有点费劲,所以,结合自己的理解,想写一篇简易通俗的KMP。      ☆☆☆ 算法目录导航页,包含基础算法、高级算法、机器学习算法等☆☆☆      1.KMP的定义     KMP其实就是一种改进的字符串匹配(查找)算法,为什么叫KMP呢,是因为其发现者Knuth-M...

守得云开见月明 965

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

通俗易懂的KMP算法详解(严蔚敏版C语言)

最近,需要复习KMP算法的next数组,然后回头看半年多后的我回头看半年多前自己综合别人内容写的介绍。 没错,自己也看不懂。然后,自己再根据自己的理解写了一下理解透彻的笔记,方便理解记忆,当然,以前的代码解释部分可以参考,笔记算法思维和算法的实现有一定的出入。望君谅解。(2018.9.30) ...

长臂人猿的博客 4万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

通俗易懂的KMP算法(C++)

KMP算法是由Knuth,Morris和Pratt三位学者发明的,所以取了三位学者名字的首字母,称作KMP算法。KMP算法主要用在字符串匹配上。比如我们从字符串"acfacfgded"(需要在哪里找的字符串称为“文本串”)找其中是否包含字符串"acfg"(需要从文本串里找的字符串我们叫做“模式串”),我们一般会想到的解法是暴力求解,两层for循环,依次对模式串的每一个元素进行匹配,如果匹配失败,下次还从模式串的第一个进行匹配,这就导致了较高的时间复杂度(O(n×m))。

Wonderful1024的博客 2891

算法-最通俗易懂的KMP算法详解

有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍。但KMP算法真的不适合这样去学。最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉。我试着从这个思路再介绍一下。大家只需要记住一点,PMT是什么东西。然后自己临时推这个算法也是能推出来的,完全不需要死记硬背。KMP算法的核心,是一个被称为部分匹配表(Partial Match ...

aodizhi5710的博客 1131

通俗讲解KMP算法,简单易懂

前言 相比较传统的暴力匹配字符串算法,KMP算法有了比较大的改进,但是它却更难理解,尤其是next数组的求解部分。本人也反复学习了几次,每次弄懂但几个月就忘了,然后就找博客重新学,下次忘了就能看自己的博文了,哈哈。 算法思想 模式串 “ABCABCABDA”,目标串:“ABCABD”,暴力算法中当目标串第六个字母D不匹配时,那么将从模式串第二个字母B开始从头匹配。我们自己判断上面字符串是否匹配时,通常的做法是遇到不匹配时,那么我们就在模式串中找到第二个以A为开头的匹配。KMP算法也是这样,但是有一个问题,就

weixin_39879846的博客 1282

如果你看不懂KMP算法,那就看一看这篇文章( 绝对原创,绝对通俗易懂)

KMP算法之浅显易懂的阐述!

Stay Hungry,Stay Foolish 2万+

最通俗易懂的KMP算法原理

KMP算法原理讲解 文章目录KMP算法原理讲解前言一、KMP算法的本质二、KMP核心算法三、KMP匹配总结 前言 其实这一期本来是打算更新一期图算法的,但是作为数据结构的助教,还是想记录和数据结构有关的一些东西,也可以理解为我想让更多的人看我写的一些东西。反正,总而言之,不管是为了什么,这一期给大家通俗易懂的讲解一下KMP算法,依旧坚持我们的宗旨,用最通俗易懂的话语来解释算法的本质! 如果本文有错误,还请大家及时纠正! 一、KMP算法的本质 大家先不要慌,这里并不给大家讲那些复杂的原理,主要给大家讲一下

weixin_44267007的博客 2123

通俗易懂且最快的理解KMP算法---详解

引言 首先问几个问题? 为什么要有KMP算法? 相对于朴素算法的过程,KMP算法的过程有哪些不同? 什么是字符串的前缀和后缀,它到底有啥用? KMP算法中的next数组是什么?为什么要用next数组? next数组的求解过程?怎样用代码实现出来? KMP算法怎样用代码实现? 我认为只要弄清楚上面的几个问题,KMP算法也就迎刃而解了。 本文就从上面几个问题一个个的铺开 一、为什么要有KMP算法? 在字符串中有一类问题是从查找子串问题,假如现在有一个主串(较长一些)和一...

好好学习。天天编程 1381

kmp算法的一种通俗理解

KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。   主要思想:“利用已经部分匹配这个有效信息,保持i指针不回溯,通过修改j指针,让模式串尽量地移动到有效的位置。” 所以,整个KMP的重点就在于当某一...

885

【C++】算法集锦(10)通俗讲kmp算法

什么是KMP算法 它是一个字符串匹配算法。 KMP算法的优势 (就恨当初写kmp那篇的时候,没有留下图解,全篇文字铺开,现在我自己都看不懂了) 首先,给定 “主串” 和 “模式串” 如下: BF算法使用简单粗暴的方式,对主串和模式串进行逐个字符的比较: 第二轮,模式串向后挪动一位,和主串的第二个等长子串比较,发现第0位字符不一致: 第三轮,模式串继续向后挪动一位,和主串的第三个等长子串比较,发现第0位字符不一致: ··· ··· 这种算法的缺点很明显,做了很多无谓的比较,还好,我们今天讲的不..

看,未来的博客 2109

KMP算法【C++实现】

KMP算法个人理解

m0_68859402的博客 4196

KMP算法的理解和实现

本文介绍了KMP算法的实现原理与代码实现。KMP算法通过预处理子串生成next数组,将时间复杂度从暴力匹配的O(mn)优化到O(m+n)。核心思想是利用最长公共前后缀信息,在失配时根据next数组调整子串指针而非回退主串指针。文章详细讲解了next数组的构建方法,并通过代码示例展示了KMP搜索函数的具体实现,包括失配时的指针调整策略。该算法通过避免不必要的回溯显著提高了字符串匹配效率。

m0_51150296的博客 1641
上一篇: 程序员必须知道的10大基础实用算法及其讲解
下一篇: 【树】 B树、B-树、B+树、B*树
dcj0913
博客等级 码龄18年 150粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值