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

2023-05-16

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

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

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

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

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

下面用反证法来说明下:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Virmach Linux安装Windows的DD镜像

    注 xff1a DD脚本是moeclub的 安装镜像一部分是80host xff0c 另一部分是收集于互联网 博客只做收集 xff0c 不保证镜像完全可用以及不存在后门程序 xff0c 请安装后自行进行病毒查杀 Windows 10 xff
  • Ubuntu安装Fcitx以及Fcitx输入中文不显示候选词框的解决办法

    一 安装Fcitx 1 安装Fcitx所需组件 sudo apt install fcitx fcitx span class hljs attribute tools span fcitx span class hljs attribut
  • Linux系统快照一键备份恢复、不同机器恢复、增量备份恢复

    Linux系统快照一键备份恢复 不同机器恢复 增量备份恢复 前言 由于前段时间在做一个自动化部署开发环境的项目需要重复安装多种服务以及中间件 xff0c 但是生产环境的服务器不像自己的虚拟机可以使用快照 xff0c 如果直接操作会导致每次测
  • NSFileManager的常用操作

    1 删除文件 NSFileManager fn 61 NSFileManager defaultManager fn removeItemAtPath filePath error nil 判断文件是否存在 if NSFileManager
  • 数据压缩 —— 一种基于LZ4算法的硬件加速的快速无损压缩

    文章目录 背景LZ4 分析令牌 xff08 Token xff09 字面量长度 xff08 Literal Length xff09 偏移量 xff08 Offset xff09 匹配长度 xff08 Match Length xff09
  • Spring AOP 是什么?

    声明 xff1a 请勿直接抄袭 xff0c 翻译不易 xff0c 转载请注明 https blog csdn net Big Rotor article details 88765984 xff0c 谢谢 文章目录 什么是面向切面编程使用
  • Hazel引擎安装踩坑

    git地址 GitHub TheCherno Hazel Hazel Engine 安装vulkan sdk LunarXchange 修改系统变量 把py的变量放在商店上面 错误 MSB8020 无法找到 v143 的生成工具 平台工具集
  • Linux 环境下编译 freeRDP

    RDP xff1a 远程桌面协议 xff08 Remote Desktop Protocol xff09 xff0c 是一个多通道的协议 xff0c 可以让客户端或称 本地电脑 连上提供微软终端机服务的电脑 xff08 服务器端或称 远程电
  • 第十一节:元组 Tuple3

    创建元组 span class hljs title scala span gt val t 61 span class hljs number 1 span span class hljs string 34 hello 34 span
  • window下rust的安装

    删除rustup重装 环境变量配置 xff1a 通过RUST HOME指定rustup的安装目录 通过CARGO HOME指定cargo的安装过目录 再次运行rustup init文件 观察到安装界面的rustup路径和和cargo已经发生
  • Vue中如何使用websocket

    1新建文件夹 socket js 目录自己看着办 可以放lib或者utils import Vue from 39 vue 39 const ReconnectingWebSocket 61 require 39 64 api webSoc
  • Unity 场景鼠标移动、旋转

    using System Collections using System Collections Generic using UnityEngine public class CameraMove MonoBehaviour privat
  • unity 相机鼠标控制移动旋转缩放

    using System using System Collections using System Collections Generic using UnityEngine public class CameraCtrl02 MonoB
  • vr全景图如何制作?vr制作用什么软件?(详细教程)

    一 vr制作用什么软件 xff1f 1 图片处理软件 Photoshop xff08 PS xff09 全称叫Adobe Photoshop Photoshop主要处理以像素所构成的数字图像 使用其众多的编修与绘图工具 xff0c 能够有效
  • OpenGL 实现大眼和瘦脸

    借鉴博客 xff1a iOS原生框架Vision实现瘦脸大眼特效 仿抖音特效相机之大眼瘦脸 本文达成效果如下图 xff1a 效果图 106个特征点如下图 特征点 原理解析 主要是以下3点 xff0c 具体请前往参考博客和原理解析 1 圆内放
  • Unity c#脚本更换物体材质球

    using UnityEngine public class TestMaterial MonoBehaviour public Material test M public Material test B void Update if I
  • 史上最全的 Java 高质量博客与网站推荐(国内篇)

    阅读文本大概需要 6 66 分钟 前言 我最近在系统整理一些 Java 后台方面的面试题和参考答案 xff0c 有找工作需求的童鞋 xff0c 欢迎关注我的 Github 仓库 xff0c 如果觉得不错可以点个 star 关注 xff1a
  • unity 打包webGL本地打不开,就算配置了iis设置了浏览器还是打不开的解决方法。

    我打包了unity的webgl但是浏览器打不开 xff0c 于是下载了火狐根据网上的相关教程 xff0c 这里有一篇比较好的 xff1a 火狐浏览器Firefox在本地打开Unity3D开发的webGL的项目 知乎 zhihu com xf
  • Unity WebGL打包后怎么运行(火狐配置)

    打包后出现以下 xff1a 其中两个文件夹都是项目资源 xff0c 只有index html才是打开Web运行的页面 使用火狐浏览器 Firefox浏览器 Firefox的用户请在浏览器的地址栏输入 about config xff0c 回
  • 720全景图在线下载

    简单的下载全景图的网站 全景管家 第一步 需要打开全景管家 xff1a https krpano scenegram cn 把合适的全景项目的链接复制到输入框中 xff0c 点击箭头进行搜索 第二步 点击 解析全景图 按钮进行解析 xff0

随机推荐