图解KMP算法

目录

  • 1.最长公共前后缀
    • 1.1前缀
    • 1.2后缀
    • 1.3最长公共前后缀
  • 2、KMP算法过程
    • 2.1例子1
    • 2.2例子2
    • 2.3Python代码:
    • 2.4next数组的计算过程

1.最长公共前后缀

1.1前缀

前缀说的是一个字符串除了最后一个字符以外,所有的子串都算是前缀。

前缀字符串:ABABC
前缀1A
前缀2AB
前缀3ABA
前缀4ABAB

以上这个例子就是排除了最后一个字符C,其余不含有尾部元素C的子串都是ABABC的前缀

1.2后缀

后缀说的是一个字符串除了第一个字符以外,所有的子串都算是后缀。

后缀字符串:ABABC
后缀1C
后缀2BC
后缀3ABC
后缀4BABC

以上这个例子就是排除了第一个字符A,其余不含有首部元素A的子串都是ABABC的后缀

1.3最长公共前后缀

Q:如何选择出最长公共前后缀?
A:在前缀集合和后缀集合里面找两个相同的子串,并且这两个子串还是最长的,这里相同的子串就是BC了,如果有ABCDEFG是前缀,ABCDEFG是后缀,ABCDE也是前缀之一,ABCDE也是后缀之一,那么就是挑最长的那个ABCDEFG了!

这个“最长公共前后缀”的意义在于在next数组里面,

2、KMP算法过程

2.1例子1

首先是主串和子串挨个字符进行匹配,这里是ABABA都匹配了,这里主串第五个元素A和模式串(图中写为了子串)的第5个元素不匹配,然后模式串ABABC的next数组是对其每个子串计算他的最长公共前后缀的长度
(注意:next长度和模式串的长度是完全一致的,next数组就是标注模式串的最长公共前后缀长度用的!)

子串模式串:ABABC最长公共前后缀
子串1A0
子串2AB0
子串3ABA1
子串4ABAB2
子串5ABABC0

以上表格的第三列00120构成下图中的next数组
因为第5个元素A和模式串的C不匹配,所以我们看模式串不匹配元素所在下标4,到next数组里面也是下标为4的地方的前一个的地方,也就是4-1=3,看下标为3的地方,对应next【3】=2说明ABAB的最长公共前后缀是2,也就是说我们前面匹配过的模式串ABABC中ABAB的最长公共前后缀是2,ABAB的AB是无需再次匹配的!(根据最长公共前后缀的定义及其意义,ABAB最长公共前后缀长度是2,ABAB的AB长度就是2,后缀也就是前缀!直接乾坤大挪移!)之后依次匹配主串和模式串,发现后续字符相等,完成匹配!over!

在这里插入图片描述

2.2例子2

在这里插入图片描述
注意:我上面这个图,最下面的红字“前2个字符不匹配”说的是AB不用再次拿去匹配了,因为前面已经匹配过了!

2.3Python代码:

在这里插入图片描述

2.4next数组的计算过程

这部分非常难以用文字描述,简单暴力清晰的讲解交给B站一位up主,记得反复观看7次以上,一定大有所获!
链接:【最浅显易懂的 KMP 算法讲解】 【精准空降到 04:21】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/410350.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KubeSphere实战

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 知…

49.仿简道云公式函数实战-文本函数-Ip

1. Ip函数 获取当前用户的ip地址 注意是Ipv4的地址 2. 函数用法 IP() 3. 函数示例 获取当前用户的ip地址IP() 4. 代码实战 首先我们在function包下创建text包,在text包下创建IpFunction类,代码如下: package com.ql.util.express.sel…

11:日志分析系统ELK|Elasticsearch|kibana

日志分析系统ELK|Elasticsearch|kibana 日志分析系统ELKELK概述Elasticsearch安装Elasticsearch部署Elasticsearch集群Elasticsearch插件 熟悉Elasticsearch的API调用_cat API创建 tedu 索引使用 PUT 方式增加数据查询数据修改数据删除数据 KibanaKibana…

(挖坑) Python调用图工具

基本效果 输入 #!/usr/bin/env pythonThis example demonstrates a simple use of pycallgraph.from pycallgraph import PyCallGraph from pycallgraph.output import GraphvizOutputclass Banana:def eat(self):passclass Person:def __init__(self):self.no_bananas()def…

Xcode与Swift开发小记

引子 鉴于React Native目前版本在iOS上开发遇到诸多问题,本以为搞RN只需理会Javascript开发,没想到冒出CocoaPod的一堆编译问题。所以横下一条心,决定直接进攻iOS本身。不管你是用React Native,还是用Flutter,iOS下的…

算能RISC-V通用云开发空间编译pytorch @openKylin留档

终于可以体验下risc-v了! 操作系统是openKylin,算能的云空间 尝试编译安装pytorch 首先安装git apt install git 然后下载pytorch和算能cpu的库: git clone https://github.com/sophgo/cpuinfo.git git clone https://github.com/pytorc…

java农产品商城商城计算机毕业设计包运行调试讲解

jsp mysql农业商城 特效:js产品轮播 功能: 前台: 1.绿色水果 图文列表 详情 2.新闻动态 文章标题列表 详情 3.有机蔬菜 图文列表 详情 4.有机谷物 图文列表 详情 5.有机大米 图文列表 详情 6.用户注册 登陆(选择用户和管…

c++ 广度优先搜索(Breadth-First Search,BFS)

广度优先搜索(Breadth-First Search,BFS)是一种图遍历算法,通常用于搜索或遍历树和图等数据结构。其基本思想是先访问起始顶点,然后逐层遍历其相邻的顶点,直到找到目标顶点或遍历完所有顶点。 BFS通常使用…

前端基础面试题(一)

摘要:最近,看了下慕课2周刷完n道面试题,记录下... 1.请说明Ajax、Fetch、Axios三者的区别 三者都用于网络请求,但维度不同: Ajax(Asynchronous Javascript ang XML),是一种在不重新…

xss-跨站脚本攻击漏洞

前备知识: Cookie和Session是Web开发中用于维持用户状态、跟踪用户会话的核心技术,它们的主要目的是在无状态的HTTP协议基础上实现有状态的用户交互。 **Cookie**: - Cookie是一种由服务器发送到客户端(通常是用户的浏览器&#x…

【JavaEE】_HttpServlet类

目录 1. init方法 2. destory方法 3. service方法 4. servlet生命周期 前文已经提及到:servlet是tomcat提供的,用于操作HTTP协议的一组API,可以将这组API理解为HTTP服务器的框架; 编写一个servlet程序,往往都要继…

【小尘送书-第十四期】《高效使用Redis:一书学透数据存储与高可用集群》

大家好,我是小尘,欢迎你的关注!大家可以一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的工作! 👨‍💻博主主页:小尘要自信 &#x1…

MySQL 篇-深入了解 DDL 语言(一)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 MySQL 说明 2.0 DDL 语言 2.1 DDL 语言 - 定义数据库 2.1.1 创建数据库操作 2.1.2 查看数据库操作 2.1.3 使用数据库操作 2.1.4 删除数据库操作 2.2 DDL 语言 …

芯片开发erp软件有哪些优势?

随着科技的飞速发展,芯片开发行业正逐渐成为推动科技进步的关键力量。在这一领域中,企业资源规划(ERP)软件的应用正逐渐普及,为芯片开发企业带来了许多显著的优势。下面,我们将详细介绍芯片开发ERP软件的优势。 一、提升管理效率 …

python JZ35 复杂链表的复制(剑指offer)

题目要求: 思路: 思路1:引入dict 思路1:双指针 代码如下: 思路1代码: # -*- coding:utf-8 -*- # class RandomListNode: # def __init__(self, x): # self.label x # self.next None # self.random None …

第十二章 Linux——日志管理

第十二章 Linux——日志管理 基本介绍系统常用日志日志管理服务日志轮替基本介绍日志轮替文件命名logrotate配置文件自定义加入日志轮转应用实例 日志轮替机制原理查看内存日志 基本介绍 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包…

Vue.js+SpringBoot开发生活废品回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案,旨在鼓…

音视频数字化(数字与模拟-电影)

针对电视屏幕,电影被称为“大荧幕”,也是娱乐行业的顶尖产业。作为一项综合艺术,从被发明至今,近200年的发展史中,无人可以替代,并始终走在时代的前列。 电影回放的原理就是“视觉残留”,也就是快速移过眼前的画面,会在人的大脑中残留短暂的时间,随着画面不断地移过,…

【X806开发板试用】PWM呼吸灯、无刷电调、按键测试样例

环境配置 通过我上篇文章:【XR806开发板试用】Ubuntu环境配置,将配置摸清楚后,就可以开始愉快的编写代码了😄 视频演示 https://www.bilibili.com/video/BV1NF411B74o/?aid295027788&cid467687216&page1 https://www…

v-on监听多个方法

方法1&#xff1a; 这个方法可以使用多个事件&#xff0c;比如点击事件、右击事件&#xff0c;左边的是事件名称&#xff0c;右边的是方法名称 <el-button type"success" v-on"{contextmenu:box,click:click}" round>成功按钮</el-button>co…