要想把把KMP算法搞清楚,必须要先了解一个叫做BF的暴力破解算法。这个算法的思路相当简单,是在串区配中最容易想到的一个算法。其实就是把所有有可能的串挨个比较一遍,这样匹配的结果一定是正确的。

如上图所示,T是主串,P是模式串,i是主串T当前的位置,j是模式串P当前的位置,当i=4,j=4时发现T[i]!=P[j],BF算法会将i回溯为1,j回溯为0重新进行下一轮的对比。

下面我们来考虑一个问题,当i=4,j=4检测到字符不相等时,到底有没有必要把i回溯到1、j回溯到0?
把i回溯到1、j回溯到0实际上是为了比较T(1,8)和P是否相等。若能百分之百确定T(1,8)和P不相等,则把i回溯到1、j回溯到0则无意义。可以直接跳过这一轮检测,直接进入下一轮i回溯为2,j回溯为0的检测。
因为T(1,3)是T(1,8)开头的3个字符,P(0,2)是P开头的3个字符。所以:
若T(1,3)不等于P(0,2),则T(1,8)则必不等于P,所以直接跳过i回溯到1、j回溯到0这一步。
若T(1,3)等于P(0,2),则T(1,8)有可能等于P,这一步不能跳过,还得继续比较。又因为前三个字符已经确定是相等的,所以不必从i=1,j=0开始比较,而是可以直接从i=4,j=3开始比较。
所以整个问题的关键就在于T(1,3)到底和P(0,2)相不相等。
又因为T(1,3)等于P(1,3),所以这个问题可以可以转化为比较P(1,3)和P(0,2)相不相等。P(1,3)其实就是P(0,3)长度为3的后缀,P(0,2)其实就是P(0,3)的长度为3的前缀。所以我们有如下结论:
当i=4,j=4检测到字符不相等时,若P长度为3的前缀和后缀相等,则i保持不变,j回溯至3即可。若不等,则整个串也必不匹配,可以跳过此次回溯。
同理我们可以得出:
当i=4,j=4检测到字符不相等时,若P长度为2的前缀和后缀相等,则i保持不变,j回溯至2即可。若不等,则整个串也必不匹配,可以跳过此次回溯。
当i=4,j=4检测到字符不相等时,若P长度为1的前缀和后缀相等,则i保持不变,j回溯至1即可。若不等,则整个串也必不匹配,可以跳过此次回溯。
当i=4,j=4检测到字符不相等时,若P不存在任何长度相等的前缀和后缀相等,则i保持不变,j回溯至0即可。

下面我们不举特殊的例子,直接推导:
假设T的长度是m,P的长度是n
当匹配到第一个不相等的字符时,根据暴力破解法,实际上进行了如下操作:

int k = j - 1;
while (k > 0) {把T从i - k开头的位置重新和P比较注意此时P(j - k, j - 1)等于T(i - k, i - 1)必相等。若此时P(0, j - 1)的长度为k的前缀和后缀相等,即P(0,k - 1)和P(j - k, j - 1)相等,则P(0, k - 1)等于T(i - k, i - 1),这就意味着T(i - k, i - k + n)和P前k个字符是相等的,所以不需要再比较了,我们可以直接比较T(i - k + k, i - k + k + n)和P(k, n - k + 1)即可,也就是比较T(i,i+n)和P(k,n-k+1)。所以i保持不变,j回溯至k。若此时P(0, j - 1)的长度为k的前缀和后缀相等,即P(0,k - 1)和P(j - k, j - 1)不相等,则P(0, k - 1)不等于T(i - k, i - 1),这就意味着T(i - k, i - k + n)和P前k个字符不相等。所以将i回溯至i-k重新比较一遍无意义。k--;
}

KMP算法前后缀原理相关推荐

  1. 【数据结构与算法】之深入解析KMP算法的核心原理和实战演练

    一.简介 ① 概念 KMP 算法是一种改进的字符串匹配算法,由 D.E.Knuth,J.H.Morris 和 V.R.Pratt 提出的,因此称它为克努特-莫里斯-普拉特操作,简称 KMP 算法. K ...

  2. KMP算法具体解释(转)

    作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...

  3. 【gif图文】KMP算法(从暴力匹配到快速匹配)

    从暴力匹配到快速匹配(KMP算法) 学习kmp算法前,首先要先了解什么是kmp算法,kmp算法具体优点是什么,kmp的主要应用方向在哪. 然后才是,代码实现 带着以上问题,我们来一步一步学习kmp算法 ...

  4. 【GO语言实现字符串匹配算法-KMP算法】

    [GO语言实现字符串匹配算法-KMP算法] KMP算法原理说明: KMP算法是一种改进的字符串匹配算法,是有D.E.Knuth,J.H.Morris和V.R.Pratt提出的,所以被称为KMP算法. ...

  5. 图解KMP算法,带你彻底吃透KMP

    模式串匹配--KMP算法 KMP算法一直是一个比较难以理解的算法,本篇文章主要根据<大话数据结构>中关于KMP算法的讲解,结合自己的思考,对于KMP算法进行一个比较详细的解释. 由于博主本 ...

  6. KMP算法真的有这么难吗?(清晰详细版)

    KMP算法我一年之前就接触了,但由于实在难以理解next[]求法故放弃,每次做一次字符串匹配的时候,很多情况下都是暴力解决,除了极个别情况把next[]求法背成模板求解AC. 注意:KMP算法已经成为 ...

  7. 终于弄懂KMP算法了

    1.简例弄懂KMP-点此链接查看 看了上面的文章,你肯定大概明白了KMP的运作原理,但是你可能对于文章提到的"部分匹配值"的又来还存在疑惑,那么请继续往下看: 我们先抛出两个问题, ...

  8. KMP算法-超级无敌详细(嚼碎了喂你)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.朴素的模式匹配算法(BF暴力匹配算法) 二.KMP算法 1.next[]数组求法 2.next[j]数组代码分析 ...

  9. C语言 实现 KMP算法

    已传入github,可下载,想测试对应函数,调用传参即可,记得注释掉之前的主函数 文件名为2022_1_19,因为是是那天写的 GitHub - frankRenlf/c_programshttps: ...

最新文章

  1. 韩国文档的编码方式_像韩国学生学习英语一样学习编码
  2. down 网卡端口周期性的up_Linux 中如何启用和禁用网卡?
  3. python系统监控_python psutil系统监控详解
  4. 安装numpy,setuptools的时候,不能再注册表中识别出来python2.7
  5. jQuery之高级选择器
  6. dotnet Blazor 用 C# 控制界面行为
  7. 【渝粤教育】电大中专跨境电子商务理论与实务 (20)作业 题库
  8. swagger core 和 swagger ui 如何关联【窥探】
  9. python 整数输出 d f_如何将数字(10,11,12,13,14,15)分配给Python 3中的字母(A,B,C,D,E,F)?...
  10. php的SAPI,CLI SAPI,CGI SAPI
  11. 江苏省职称计算机考试internet,江苏省计算机职称考试题库及答案
  12. signal、kill、fork
  13. Android 11 系统字体加载流程
  14. 第十一届蓝桥杯省赛B组真题训练
  15. 目前可行的4种知网文献免费下载方法分享
  16. 7-97 约会成功了吗?
  17. STM32MP157C-DK2->Develop on Arm® Cortex®-A7之 C语言开发uart例程
  18. HDU6608 Fansblog
  19. 【Java】若依前后端分离,分页数据为null报错
  20. TVM中的auto-scheduling机制(Ansor)学习笔记

热门文章

  1. 快手公布于香港联交所主板上市计划详情;木莲庄酒管全线开放加盟合作 | 美通企业日报...
  2. Weblogic 弱密码+部署war包getshell
  3. Java redis 删除单个和多个key的方法
  4. scipy butter 滤波器实现
  5. 苹果发布了没有太多更新的 iOS 13 beta 8;一次编码、到处运行;SwiftUI 的两个特性;如何让网站加载更快...
  6. C语言实现自动出题、单词拼写等功能,附带管理员模式
  7. canvas写的地铁地图
  8. 盘点 | 2023年最值得学的编程语言TOP 5,Python再度夺冠!
  9. 【Elastic Search权威指南 读书小记3】ES之数据操作
  10. 欧拉全新发布:基础软件的技术溢出效应或再现!