KMP算法用于在母串中查找子串的出现位置。

KMP算法:字符串匹配问题【有详细的引入过程,很容易理解掌握】

首先我们都知道,KMP算法的next数组可以指导匹配失败情况下,子串(模式串)的指针应该跳到哪里,而母串的指针是从来不会回头的。

假如在母串被跳跃过的部分中有个起点,恰好可以和子串匹配,那么我们不就错失正确答案了吗?

其实,这种情况是不会发生的,我们用的最长相同前后缀这个条件就限制了这种情况的发生。

下面用反证法来说明下:

如下的母串和子串,假设子串的最长相同前后缀是A这一部分(是一段,不是说一个字母A)

在匹配到红叉时,发现匹配失败。

按照我们的跳跃规则,我们可以直接跳过母串中间的空白部分,直接进行“?”处这一步的比较:

质问的问题是:在母串的被跳跃的部分,是否可能存在一个我们漏掉的答案?如下图所示,粉色框内完全匹配,表示我们漏掉的答案。

我们利用反证法来证明这种情况是不可能发生的。我们先假设上图所述情况真的存在。

因为粉色框内子串和母串相匹配,所以我们很容易在子串和母串中补全一些最长相同前后缀A。

补全后如下图所示,并且我们把母串两个A中间的部分称为B部分。

进一步补全图中的B部分。(此时我们把之前匹配成功的子串再挪回最开始的位置,方便我们找相同的量)

因为假设的子串和子串是同一个串,那么B在子串中一定存在(因为这里是匹配过的了),在假设的子串中也一定存在,同理 B之前的A部分也存在。

此时我们发现母串和子串以及我们假设的子串中,都出现了ABA这个部分,由于子串和假设的子串是一个东西,所以我们可以最终发现,子串中有ABA部分的前缀和后缀,也就是他的最长相等前后缀并不是A,而是ABA。

这跟我们的假设A是最长相同前后缀是不同的,所以可以说明,根本不存在这种情况。

结论:我们利用最长相同前后缀的条件,保证了每次子串的移动(也就是母串的被跳跃)是一定不会漏掉正确答案的。

到这里证明结束,其实KMP思想非常的简单,经过上面的讨论,如下图所示,匹配失败,你觉得再从哪里开始比较更合适?

你一定想说从子串的开头ABA和母串的适配的ABA,那这个ABA是个啥?

奥,是子串的最长相同前后缀。也就是我们辛辛苦苦求出来的next数组了。

反证法证明:为什么KMP算法不会跳过(漏掉)正确的答案相关推荐

  1. Leetcode28 KMP算法 击败100%

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

  2. 【模式匹配】之 —— KMP算法详解及证明

    一    RevisionsHistory 1 一       Revisions History 二       前言 三       关于算法学习 四       KMP算法始末 KMP算法是用来 ...

  3. 0x15.基本数据结构 — 字符串 (KMP算法(含详细证明)和最小表示法)

    目录 一.KMP模式匹配 1.引理: 2.引理证明: 3.使用优化的算法计算nextnextnext数组: 4.luogu P3375 [模板]KMP字符串匹配 5.UVA1328 Period 6. ...

  4. leetcode28. Implement strStr() (以及个人对KMP算法理解)

    kmp算法标准板子题 class Solution { public:vector<int> getNext(string needle){vector<int> next(n ...

  5. 【讲●解】KMP算法

    KMP算法 我们小组负责讲这个... 术语与规定 为了待会方便,所以不得不做一些看起来很拖沓的术语,但这些规定能让我们更好地理解\(KMP\)甚至\(AC\)自动机. 字符串匹配形式化定义如下: 假设 ...

  6. 字符串匹配算法——KMP算法学习

    KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...

  7. 3000+长文带你进入KMP算法思想

    1. 基本介绍 原文最先在博客园发布,原地址:3000+长文带你进入KMP算法思想 1.1 说明 时间复杂度: O ( N ) O(N) O(N): 空间复杂度: O ( N ) O(N) O(N): ...

  8. 2020年最全最简单KMP算法讲解

    目录 1.KMP算法的来源 2.最大公共前后缀 3.KMP算法原理 4.next数组 5.next数组值的确定 6.KMP算法的缺陷 7.KMP算法的改进 1.KMP算法的来源 其实博主刚看KMP算法 ...

  9. 字符串处理 —— 单模式匹配 —— MP 算法与 KMP 算法

    [概述] KMP 是在 MP 算法的基础上改进出来的,两者的核心思想与匹配过程相同,唯一不同的是在于 next 数组的求法,其目的是为了避免 MP 算法中明显失败的匹配. KMP 算法又称 Knuth ...

最新文章

  1. C#textbox只能输入数字和英文句号
  2. 网络学习(十二)文本模式安装Red Hat Linux 9
  3. Codeforces Round #660 (Div. 2)
  4. 推荐阅读《大话设计模式》的策划编辑陈禹成写的新书《电脑使用说明书》
  5. YOLOv5在建筑工地中安全帽佩戴检测的应用(已开源+数据集)
  6. linux 双网卡 双交换机,linux双网卡bond及交换机配置
  7. RabbitMQ-镜像队列配置相关
  8. c语言在线测试题,C语言测试题
  9. Hosts文件与钓鱼网站
  10. Protel 介绍 protel99se正式汉化版下载 Protel DXP2004简体中文版
  11. dsp性能测试软件,慧明D4300专业DSP数字功放测试软件
  12. 必备知识:工业相机相关知识(初学者必备)
  13. 花一样的数据可视化分析工具汇总,你选谁
  14. 数据库mysql性能优化-学习笔记
  15. 作为一名视觉工程师该怎么学习?
  16. 软件测试方法比较(给新手)
  17. Centos安装MegaCli
  18. 增强 Stream 接口的 distinct 方法的一些思考
  19. javafx 教程_JavaFX技巧32:需要图标吗? 使用Ikonli!
  20. 百度之星2021 决赛

热门文章

  1. 新加坡科技巨头Sea亏损小于预期,外资“清算”阿里只为加大赌注
  2. 二、TTY子系统框架
  3. 纯小白新人菜鸟第一次unity VR项目与matlab联动调试过程记录超详细版本2023.3.12
  4. 程序员B站项目分享:啪一下子回到了10年前的B站,要泪目了
  5. 《cypher》游戏第三章攻略
  6. 修改Pycharm中默认浏览器
  7. 关于HAL库中系统嘀嗒时钟的简单探究
  8. Re: 爱情物语(经典)
  9. mysql查询最近一个自然周_自然周与自然月的Hive统计SQL
  10. Kaili忘记root密码