反证法证明:为什么KMP算法不会跳过(漏掉)正确的答案
KMP算法用于在母串中查找子串的出现位置。
KMP算法:字符串匹配问题【有详细的引入过程,很容易理解掌握】
首先我们都知道,KMP算法的next数组可以指导匹配失败情况下,子串(模式串)的指针应该跳到哪里,而母串的指针是从来不会回头的。
假如在母串被跳跃过的部分中有个起点,恰好可以和子串匹配,那么我们不就错失正确答案了吗?
其实,这种情况是不会发生的,我们用的最长相同前后缀这个条件就限制了这种情况的发生。
下面用反证法来说明下:
如下的母串和子串,假设子串的最长相同前后缀是A这一部分(是一段,不是说一个字母A)。
在匹配到红叉时,发现匹配失败。
按照我们的跳跃规则,我们可以直接跳过母串中间的空白部分,直接进行“?”处这一步的比较:
质问的问题是:在母串的被跳跃的部分,是否可能存在一个我们漏掉的答案?如下图所示,粉色框内完全匹配,表示我们漏掉的答案。
我们利用反证法来证明这种情况是不可能发生的。我们先假设上图所述情况真的存在。
因为粉色框内子串和母串相匹配,所以我们很容易在子串和母串中补全一些最长相同前后缀A。
补全后如下图所示,并且我们把母串两个A中间的部分称为B部分。
进一步补全图中的B部分。(此时我们把之前匹配成功的子串再挪回最开始的位置,方便我们找相同的量)
因为假设的子串和子串是同一个串,那么B在子串中一定存在(因为这里是匹配过的了),在假设的子串中也一定存在,同理 B之前的A部分也存在。
此时我们发现母串和子串以及我们假设的子串中,都出现了ABA这个部分,由于子串和假设的子串是一个东西,所以我们可以最终发现,子串中有ABA部分的前缀和后缀,也就是他的最长相等前后缀并不是A,而是ABA。
这跟我们的假设A是最长相同前后缀是不同的,所以可以说明,根本不存在这种情况。
结论:我们利用最长相同前后缀的条件,保证了每次子串的移动(也就是母串的被跳跃)是一定不会漏掉正确答案的。
到这里证明结束,其实KMP思想非常的简单,经过上面的讨论,如下图所示,匹配失败,你觉得再从哪里开始比较更合适?
你一定想说从子串的开头ABA和母串的适配的ABA,那这个ABA是个啥?
奥,是子串的最长相同前后缀。也就是我们辛辛苦苦求出来的next数组了。
反证法证明:为什么KMP算法不会跳过(漏掉)正确的答案相关推荐
- Leetcode28 KMP算法 击败100%
实现 strStr() 函数. 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始).如果不存在,则返 ...
- 【模式匹配】之 —— KMP算法详解及证明
一 RevisionsHistory 1 一 Revisions History 二 前言 三 关于算法学习 四 KMP算法始末 KMP算法是用来 ...
- 0x15.基本数据结构 — 字符串 (KMP算法(含详细证明)和最小表示法)
目录 一.KMP模式匹配 1.引理: 2.引理证明: 3.使用优化的算法计算nextnextnext数组: 4.luogu P3375 [模板]KMP字符串匹配 5.UVA1328 Period 6. ...
- leetcode28. Implement strStr() (以及个人对KMP算法理解)
kmp算法标准板子题 class Solution { public:vector<int> getNext(string needle){vector<int> next(n ...
- 【讲●解】KMP算法
KMP算法 我们小组负责讲这个... 术语与规定 为了待会方便,所以不得不做一些看起来很拖沓的术语,但这些规定能让我们更好地理解\(KMP\)甚至\(AC\)自动机. 字符串匹配形式化定义如下: 假设 ...
- 字符串匹配算法——KMP算法学习
KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...
- 3000+长文带你进入KMP算法思想
1. 基本介绍 原文最先在博客园发布,原地址:3000+长文带你进入KMP算法思想 1.1 说明 时间复杂度: O ( N ) O(N) O(N): 空间复杂度: O ( N ) O(N) O(N): ...
- 2020年最全最简单KMP算法讲解
目录 1.KMP算法的来源 2.最大公共前后缀 3.KMP算法原理 4.next数组 5.next数组值的确定 6.KMP算法的缺陷 7.KMP算法的改进 1.KMP算法的来源 其实博主刚看KMP算法 ...
- 字符串处理 —— 单模式匹配 —— MP 算法与 KMP 算法
[概述] KMP 是在 MP 算法的基础上改进出来的,两者的核心思想与匹配过程相同,唯一不同的是在于 next 数组的求法,其目的是为了避免 MP 算法中明显失败的匹配. KMP 算法又称 Knuth ...
最新文章
- C#textbox只能输入数字和英文句号
- 网络学习(十二)文本模式安装Red Hat Linux 9
- Codeforces Round #660 (Div. 2)
- 推荐阅读《大话设计模式》的策划编辑陈禹成写的新书《电脑使用说明书》
- YOLOv5在建筑工地中安全帽佩戴检测的应用(已开源+数据集)
- linux 双网卡 双交换机,linux双网卡bond及交换机配置
- RabbitMQ-镜像队列配置相关
- c语言在线测试题,C语言测试题
- Hosts文件与钓鱼网站
- Protel 介绍 protel99se正式汉化版下载 Protel DXP2004简体中文版
- dsp性能测试软件,慧明D4300专业DSP数字功放测试软件
- 必备知识:工业相机相关知识(初学者必备)
- 花一样的数据可视化分析工具汇总,你选谁
- 数据库mysql性能优化-学习笔记
- 作为一名视觉工程师该怎么学习?
- 软件测试方法比较(给新手)
- Centos安装MegaCli
- 增强 Stream 接口的 distinct 方法的一些思考
- javafx 教程_JavaFX技巧32:需要图标吗? 使用Ikonli!
- 百度之星2021 决赛