KMP-字符串查找算法

数据结构、算法总述:数据结构/基础算法 C/C++_禊月初三的博客-CSDN博客


问题:假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?

暴力匹配

即2层循环,太过复杂

for (int i = 1; i <= n; i ++ )
{bool flag = true;  // 初始化一个标志变量,用于标记是否匹配成功for (int j = 1; j <= m; j ++ ){if (s[i + j - 1] != p[j]){flag=false;  // 如果字符不匹配,将标志变量设置为falsebreak;       // 并退出内层循环}}
}

时间复杂度:O(m*n)


KMP算法

KMP(Knuth-Morris-Pratt)算法是一种在字符串中查找子串的高效算法,由Donald Knuth, Vaughan Pratt和James H. Morris共同发明。KMP算法的核心思想是,当出现不匹配时,能够利用已经匹配的信息,将模式串合理地向右滑动,跳过一些必然不匹配的位置,从而提高搜索效率。

KMP算法的主要步骤包括两个部分:

  1. 计算Next[]
  2. 利用Next[]进行匹配。 

理解KMP算法如何运用前缀与后缀的信息:

查找主串(text)中的模式串(partern)

  1. 从前往后一一匹配,发现x与d不匹配,且d前子串中没有前缀和后缀相同的情况,所以下次将a与x进行匹配,发现不匹配随将其后移一位,使a与a进行匹配;
  2. 从前往后一一匹配,发现x与c不匹配,且c前子串中存在ab为子串相同前后缀(一定要最长的相同前后缀),这意味着x左侧一定与模式串前2位相同为ab,则下次匹配只需将模式串中的c与x进行匹配;
  3. x与c不匹配,且x前子串中没有前缀和后缀相同的情况,所以下次将a与x进行匹配,发现不匹配随将其后移一位,使a与a进行匹配;
  4. 从前往后一一匹配,发现匹配完成,即查找到text中pattern的位置。

如何高效的处理前缀与后缀:

计算Next[]

  1. i与j对应字符不同,将i所对应的字符(b)对应的值计为0,并将i后移;
  2. 同理可得c,d对应值也为0;
  3. 当i与j对应的字符相等时,将i对应的值计为j下标+1,并将i,j同时后移;
  4. 同理可将b,c对应值计算出
  5. 当i与j对应字符不同时,看j对应字符的前一个字符所计算的值,并找到pattern中下标与该值相同所对应的字符,并将j前移至该字符;
  6. 当i, j所对应字符相同时,将j下标+1计为i的值。

eg:

在这个主串和模式串上运用KMP算法:

算法模板 

// s[]是主串,p[]是模式串,n是s的长度,m是p的长度
// 求模式串的Next数组:
for (int i = 2, j = 0; i <= m; i ++ )
{while (j && p[i] != p[j + 1]) j = ne[j];if (p[i] == p[j + 1]) j ++ ;ne[i] = j;
}// 匹配
for (int i = 1, j = 0; i <= n; i ++ )
{while (j && s[i] != p[j + 1]) j = ne[j];if (s[i] == p[j + 1]) j ++ ;if (j == m){j = ne[j];// 匹配成功后的逻辑}
}

时间复杂度:O(m+n)

题目:

831. KMP字符串 - AcWing题库icon-default.png?t=N7T8https://www.acwing.com/problem/content/833/ KMP算法视频参考:

【搬运】油管阿三哥讲KMP查找算法,中英文字幕,人工翻译,简单易懂_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/540989.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端路由跳转bug

路由后面拼接了id的千万不能取相近的名字&#xff0c;浏览器分辩不出&#xff0c;只会匹配前面的路径 浏览器自动跳转到上面的路径页面&#xff0c;即使在菜单管理里面配置了正确的路由 跳转了无数次&#xff0c;页面始终不对&#xff0c;检查了路由配置&#xff0c;没有任何问…

【C语言】字符与字符串---从入门到入土级详解

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.字符类型和字符数组&#xff08;串&#xff09;简介 1.ASCII 2.定义&#xff0c;初始化&#xff0c;使用 1>字符的定义及初始化 2>字符串的定义及初始化 二.…

最新Windows精简iso镜像运行超流畅!附下载

官网地址&#xff1a;https://archive.org/search?querysubject%3A%22tiny11%22 Tiny11是知名民间大神NTDEV打造的精简版Windows 11系统&#xff0c;基于于Windows 11 Pro 22H2的ISO镜像改进&#xff0c;删除了大量的微软内置应用&#xff0c;因此对硬件资源的要求更低&#…

kettle 9.4和Pentoho 9.4下载及安装方法简介

kettle 9.4和Pentoho 9.4下载及安装方法简介 下载地址&#xff1a; https://sourceforge.net/projects/pentaho/files/ 下载步骤&#xff1a; #------------- 一、点击选项卡&#xff1a;summary/ 二、点击第一行链接 https://www.hitachivantara.com/en-us/products/pentaho…

SQL面试学习 行列转换

行列转换 多行转多列 concat_ws&#xff1a;把集合中的值用指定分隔符连接 collect_set&#xff08;&#xff09;&#xff1a;收集唯一值并返回一个集合 SQL字符串拼接函数concat()、collect_set()、collect_list()和concat_ws()用法 cast&#xff08;&#xff09;将任何类型…

米尔更新面向工业产品的软件系统-基于瑞米派(Remi Pi)

米尔电子发布的瑞萨第一款MPU生态板卡——瑞米派&#xff08;Remi Pi&#xff09;自上市当天200套售罄&#xff0c;获得不少新老用户的青睐。为感谢大家的支持&#xff0c;米尔加推300套瑞米派活动&#xff0c;以补贴价回馈大家&#xff0c;抢完即止&#xff01; 不仅如此&…

Kyligence 亮相 Gartner 数据与分析峰会,生成式 AI 落地赋能业务

3月11日-13日&#xff0c;Gartner 2024 数据与分析峰会 (Gartner Data & Analytics Summit) 在美国奥兰多盛大召开。作为全球领先的大数据分析和指标平台供应商&#xff0c;Kyligence 出席本次峰会并发表了 Kyligence: AI Enables Intelligent PDCA&#xff08;AI 赋能从计…

姿态旋转的哥氏定理以及速度微分的推导

姿态旋转中涉及到坐标系的转换&#xff0c;在有相对旋转的两个坐标系中观察一个向量的变化&#xff0c;用到了哥氏定理。 例如在i系中观察e系下的运动&#xff0c;则 哥氏定理的公式 wie是e相对于i的角运动 注意符号i在前e在后。 wie是e相对于i的角运动 注意符号i在前e在…

Qt之格栅布局(QGridLayout)控件填满整个单元格

Qt专栏&#xff1a;http://t.csdnimg.cn/GQN1M 目录 1.现象1 2.解决方案 3.现象2 4.解决方案 5.总结 1.现象1 今天在用QGridLayout布局的时候&#xff0c;添加到布局的QWidget有文本框、标签、组合框和按钮等等&#xff0c;布局两列&#xff0c;通过下面的方式添加进去的&…

用网格大师网络重划分时,坐标原点按照XML文件原点填写,导出的瓦块文件命名不对,坐标原点该怎么填写

瓦块名称和原来不一致的原因是瓦块原点这里设置的不对&#xff0c;要和重建设置的瓦块原点保持一致。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一&#xff0c;重叠区域处理问题的工具“百宝箱”&#xff0c;集格式转换、坐标转换、轻量化、瓦片重划分…

算法打卡day13|二叉树篇02|Leetcode 102.二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

在做题之前说明 Deque和Queue 在Java中&#xff0c;Deque和Queue是两种不同的数据结构接口&#xff0c;它们都继承自Collection接口&#xff1b;Deque是Queue的超集&#xff0c;提供了更多的操作和灵活性&#xff0c;以下它们之间存在一些关键的区别&#xff1a; 操作范围&…

web学习笔记(三十三)

目录 1.严格模式 1.1严格模式的概念&#xff1a; 1.2严格模式在语义上更改的地方&#xff1a; 1.3如何开启严格模式 1.4严格模式应用上的变化 2.原型链 1.严格模式 1.1严格模式的概念&#xff1a; 严格模式有点像es5向es6过渡而产生的一种模式&#xff0c;因为es6的语法…