本文是介绍 什么是 BF算法KMP算法BM算法 三部曲之一。

KMP算法 内部涉及到的数学原理与知识太多,本文只会对 KMP算法 的运行过程、 部分匹配表next数组 进行介绍,如果理解了这三点再去阅读其它有关 KMP算法 的文章肯定能有个清晰的认识。

以下的文字描述请结合视频动画来阅读~

视频地址:https://www.bilibili.com/video/av60334201/

定义

Knuth-Morris-Pratt 字符串查找算法,简称为 KMP算法,常用于在一个文本串 S 内查找一个模式串 P 的出现位置。

这个算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发表,故取这 3 人的姓氏命名此算法。

是不是感觉 Donald Knuth 这个名字很眼熟?没错,在前面 这或许是讲解 Knuth 洗牌算法最好的文章 一文中也出现了他!

下面直接给出 KMP算法 的操作流程:

  • 假设现在文本串 S 匹配到 i 位置,模式串 P 匹配到 j 位置
  • 如果 j = -1,或者当前字符匹配成功(即 S[i] == P[j] ),都令 i++,j++,继续匹配下一个字符;
    如果 j != -1,且当前字符匹配失败(即 S[i] != P[j] ),则令 i 不变,j = next[j]。此举意味着失配时,模式串 P相对于文本串 S 向右移动了 j - next [j] 位
  • 换言之,将模式串 P 失配位置的 next 数组的值对应的模式串 P 的索引位置移动到失配处

看不明白?直接看动画!

运行过程

以下图文本串 S 与模式串 P 为例:

首先,列出模式串 P 的所有子串:

a              
a b            
a b a          
a b a a        
a b a a b      
a b a a b c    
a b a a b c a  
a b a a b c a c

然后,求得每一个子串的所有前缀与后缀。

前缀 指除了最后一个字符以外,一个字符串的全部头部组合;后缀 指除了第一个字符以外,一个字符串的全部尾部组合。

以第五列为例进行演示。

前缀

a      
a b    
a b a  
a b a  

后缀

b      
a b    
a A b  
b a a b

因此,它的前缀后缀的公共元素的最大长度为 2

求得原模式串 P 的子串对应的各个前缀后缀的公共元素的 最大长度表 下图。

根据最大长度表 去求 next 数组next 数组相当于“最大长度值” 整体向右移动一位,然后初始值赋为-1

好了,获取了 next 数组 后,KMP 算法 的操作就很清晰了。

将模式串 P 与文本串 S 的字母一个个进行匹配,当失配的时候,模式串向右移动。

怎么移动?

比如模式串的 b 与文本串的 c 失配了,找出失配处模式串的 next数组 里面对应的值,这里为 0,然后将索引为 0 的位置移动到失配处。

转载于:https://www.cnblogs.com/fivestudy/p/11287725.html

七分钟理解什么是 KMP 算法相关推荐

  1. BF算法和KMP算法

    给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式.这里将介绍处理串匹配问题的两种算法,BF算法和KMP算法. BF算法 (暴力匹配 ...

  2. 模式搜索的KMP算法详解与C语言代码实现

    Table of Contents 模式搜索的KMP算法 如何更好地理解和掌握 KMP 算法? 推荐文章 Knuth-Morris-Pratt 字符串查找算法,简称为 "KMP算法" ...

  3. 字符串匹配问题 ----- KMP算法

    题意: 任意给定一段字符串str("123abc123abc00abc") 再输入一个关键字key("abc") 要求返回str中包含key的所有子串的头下标 ...

  4. 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)

    图 如何存储微博.微信等社交网络中的好友关系?图.实际上,涉及图的算法有很多,也非常复杂,比如图的搜索.最短路径.最小生成树.二分图等等.我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的 ...

  5. KMP算法及next数组(最大公共前后缀)求解

    KMP算法及next数组(最大公共前后缀)求解 2020.12.14理解: 1. KMP算法 网上关于KMP算法讲解较为简单易懂,因此在此只作简述: 在字符串s中匹配字符串t: S: ABE-AB-A ...

  6. 字符串匹配KMP算法及其时间复杂度分析

       字符串匹配算法是非常常见的算法.考虑长度为nnn的文本(text)字符串A[1,2,⋯,n]A[1,2,\cdots,n]A[1,2,⋯,n],长度为mmm的匹配(pattern)字符串B[1, ...

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

    如果你看不懂KMP算法,那就看一看这篇文章(绝对原创,绝对通俗易懂) KMP算法,俗称"看毛片"算法,是字符串匹配中的很强大的一个算法,不过,对于初学者来说,要弄懂它确实不易.整个 ...

  8. 字符串的KMP算法--Python实现

    KMP算法Python实现 今天研究KMP算法,看来很多版本,有不同的语言写的,但是感觉越看越乱,最后自己试着写一份进行总结 首先,KMP算法使字符串匹配中的优化算法,使原来的O(m*n)降到了O(m ...

  9. Leetcode28 KMP算法 击败100%

    实现 strStr() 函数. 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始).如果不存在,则返 ...

最新文章

  1. 大学计算机专业和物理专业哪个难,大学里最难毕业的3大专业,尤其是最后一个...
  2. 架构师之路 — 软件架构 — 软件版本定义
  3. linux相关面试题总结!
  4. LightGBM笔记
  5. c++指针引用导出文件
  6. SAP Cloud for Customer 技术概述
  7. 10 i lt shell的if_shell脚本----if(数字条件,字符串条件,字符串为空)
  8. Q+开放的互联网:腾讯QQ “亮剑” 开放平台
  9. 我的MYSQL学习心得(十一) 视图
  10. 航拍+AI︱paddlepaddle图像分割实现天空风格迁移(换天、漂浮城堡、宇宙飞船)
  11. 【转】宝贝,我要出嫁了……
  12. java insert 返回主键_MyBatis中insert操作返回主键的实现方法 – java – www.cfei.net
  13. 深入浅出虚拟机-第三版笔记(重点)整理-2022-04-06
  14. C语言的考试系统,C语言考试系统.doc
  15. openwrt php 编译环境,在linux下修改编译网件WNDR3700v4的Openwrt固件,支持128MB NAND
  16. 人人都是极客半月刊:第 3 期
  17. 内联函数有什么优点?内联函数和宏定义的区别
  18. vscode如何自动格式化代码
  19. PDF Squeezer for Mac(强大的PDF文件压缩工具)
  20. 学习别人的方法,借鉴

热门文章

  1. /UI5/IF_UI5_REP_PERSISTENCE - why I cannot deploy app to GM6
  2. python web server_Python实现简易版的Web服务器(推荐)
  3. jmeter吞吐量_进阶Spring Boot---Tomcat与Undertow 吞吐量对比
  4. wireshark 抓包iphone 4g_比4G下续航短2小时,苹果回应iPhone12用5G耗电快:与运营商一道做更多优化工作...
  5. 0-1背包问题(C语言)
  6. Python中span()函数的作用
  7. 买卖股票的最好时机二Python解法
  8. centos6安装mysql并远程连接_如何开启phpstudy中mysql的远程连接
  9. java lambda例子_Java lambda 表达式常用示例
  10. c语言ox32左移一位的值,程序设计基础 (C)(32+32) 实验指导书.docx