• KMP算法


    今天在做力扣的题目的时候遇到了KMP算法,力扣将那个题目归到了简单的行列,看来是我水平不够了!

    一、 实现过程

    首先我来演示一下KMP算法的实现过程

    现在有一个主串S=ababcabcacbab以及模式串T=abcac 

    实现过程如下所示:

     有了上面的解答之后,应该还是存在疑惑的,但是没关系,下面我就会对这些问题进行解答

    二、 一些问题的说明

    大家都知道,对于这个字符串匹配的问题,我们是可以使用暴力求解的方式进行解答的,但是暴力求解就会存在一个问题,就是每次都要回退到当前匹配的位置的后一个字符,这样的话时间复杂度难免就会变得很大

    那么就有了KMP算法的产生

    在KMP算法中,采用对模式串的回退来进行字符串的匹配,就减少了匹配的次数,那么在KMP算法中最需要讲解的也就是模式串是怎么回退的?也就是我们需要的next数组的讲解!

    三、next数组的实现

    (一)next数组的手动实现

    我们都知道KMP算法实现的是最长前缀匹配

    next数组也是在这个基础上实现的,next数组使用的是当前数据+1,然后规定第一个字符的next的值为0,next[i]的值等于模式串的前i-1个最长前后缀的值+1

    我们通过串abaabca来进行讲解 

    那么对应的next数组就是

    这就是我们的手动创建next数组了 

    另外附上一位up主的讲解的截图

    (二)next数组的代码讲解与图解代码

     代码如下所示:

    1. public int nextResult(char ch[],int length,int next[]){
    2. next[1]=0;
    3. int i=1,j=0;
    4. while(i
    5. if(j==0||ch[i]==ch[j]) next[++i]=++j;
    6. else j=next[j];
    7. }
    8. }

    我们来模拟一下代码的实现过程:

     上面就是整个的实现过程了,我们可以发现,无论什么时候我们都可以找到最后的解

    我们还可以使用图解法进行求解:

     

     

    以上就是KMP算法的本人的简单理解了!

  • 相关阅读:
    Apache Solr9.3 快速上手
    C#面:switch 表达式可以用什么类型?能用 string 类型吗?
    vmware 用不了声音,设置声音那个位置的输出是伪输出,输入也不能动
    中国多主数据库:压强投入,期待破茧
    【HarmonyOS】应用通知广播的使用
    亚马逊测评自养号,如何进行系统性的学习?
    sip网络话筒主机SIP桌面式对讲广播主机
    【shell】 1、bash语法超详细介绍
    对占用多字节和位的报文信号解析详解
    ROS一键安装
  • 原文地址:https://blog.csdn.net/young_man2/article/details/126156306