当前位置: 首页 > news >正文

【算法】kmp

KMP算法

名称由来

是由发明这个算法的三个科学家的名称首字母组成

作用

用于字符串的匹配问题

举例说明

字符串 aabaabaaf
模式串 aabaaf

传统匹配方法

第一步

aabaabaaf
aabaaf

此时,b和f不一致,则把模式串从头和文本串的第二个字符开始比

第二步

aabaabaaf
_aabaaf

。。。。。以此类推,知道找到相同的或者结束

KMP算法

第一步

aabaabaaf
aabaaf

此时,b和f不一致,但是b和f前面的子串 aabaa
拥有最长相等前后缀2,因此可以跳过前两个字符 aa
,直接用文本串的 b 和 模式串的第三个字符继续比较

第二步

aabaabaaf
___aabaaf

。。。。。以此类推,知道找到相同的或者结束

最长相等前后缀

定义,以aabaa 为例
前缀:不包括最后一个字符
a
aa
aab
aaba

后缀:不包括第一个字符
a
aa
baa
abaa

最长相等前后缀就是 aa 长度为2

每一个字符串都对应一个最长相等前后缀表
aabaa
next[5] 0 1 0 1 2

如何求next表

初始化

next[0]=0

根据定义,单个字符,没有前后缀,最大公共长度自然为0

定义j=0,表示0…j为最长公共前后缀

定义i=1,从arr[1]开始遍历,求next[1]。。。

过程模拟

next[1]==next[0] 即next[i]==next[j]表示0…1(即0…i)子串aa的最大公共前后缀为0…0( 即0…j)a

j++

i++

next[2]!=next[1] 即next[i]!=next[j]表示0…1(即0…i)子串aa的最大公共前后缀为0…0( 即0…j)a

http://www.lryc.cn/news/3462.html

相关文章:

  • git 常用命令之 git checkout
  • 一些常见错误
  • [单片机框架][调试功能] 回溯案发现场
  • MySQL主从同步-(二)搭建从机服务器
  • Linux系列 备份与分享文档
  • SNI生效条件 - 补充nginx-host绕过实例复现中SNI绕过的先决条件
  • 傻白探索Chiplet,Modular Routing Design for Chiplet-based Systems(十一)
  • C语言静态库、动态库的封装和注意事项
  • MyBatis-Plus分页插件和MyBatisX插件
  • 年前无情被裁,面试大厂的这几个月…
  • 基于Java的分片上传功能
  • KDS安装步骤
  • JavaSE-线程池(1)- 线程池概念
  • 开源代码的寿命为何只有1年?
  • 完善登录功能--过滤器的使用
  • CSS基础:属性和关系选择器
  • 设计模式:原型模式解决对象创建成本大问题
  • 驱动开发(二)
  • 《狂飙》大结局,这22句经典台词值得细品
  • 【计算机网络期末复习】第二章 物理层
  • 多核异构核间通信-mailbox/RPMsg 介绍及实验
  • 【Rust日报】2023-02-11 从头开始构建云数据库 RisingWave - 为什么我们从 C++ 转向 Rust...
  • Linux驱动开发(一)
  • Spring MVC 之返回数据(静态页面、非静态页面、JSON对象、请求转发与请求重定向)
  • leetcode-每日一题-2335(简单,贪心)
  • Verilog语法之数学函数
  • 【手撕面试题】JavaScript(高频知识点一)
  • 如何用PHP实现消息推送
  • 电子学会2020年6月青少年软件编程(图形化)等级考试试卷(四级)答案解析
  • DaVinci:调色版本