KMP算法实现strStr(c++代码实现)

news2024/11/27 1:43:50

1 KMP算法简介

KMP算法是一个解决字符串匹配问题的算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出。当给你一个主串str和一个子串substr,如何确定substr在主串中出现的位置?如果没有学习KMP算法,我们可能会写出这样的代码

int strStr(string str, string substr)
{
  	if(str.size() < substr.size())
    {
      	return -1;
    }
  	int start1 = 0;//遍历主串
  	int start2 = 0;//遍历子串
  	int next = 1;//如果本次匹配失败,主串回退的位置。
  	while(start1 < str.size())
    {
      	if(str[start1] == substr[start2])
        {
          	start1++;
          	start2++;
          	if(start2 == substr.size())
            {
              	//找到了
              	return start1 - substr.size();
            }
        }
      	else
        {
          	//主串回退到next,子串回退到0
          	start1 = next;
          	next++;
          	start2 = 0;
        }
    }
  	return -1;
}

我们发现这样写每次匹配失败的时候主串都会回退到next,子串回退到起始位置。而KMP算法的主要思想就是在匹配失败的时候,主串不回退,子串尽可能的少回退。下面我们来学习一下是如何实现的。

2 KMP算法原理

2.1 next数组

首先在学习KMP算法之前,我们需要先引入next数组的概念。假如给定一个字符串s,这个字符串的next数组是一个整形数组,next[i]里保存的是字符串下标[0, i)范围内,找到两个相等的真子串,一个子串从0开始,一个子串以i-1结尾,next[i]保存的就是相等真子串的长度。我们规定next[0] = -1, next[1] = 0;下面我们举个例子求一下next数组。

  • 给定string s = “abcabc”,求该子串的next数组。

    image-20230620065932174

上面的例子我们是通过肉眼看出来的next数组,那我们如何写代码实现一个求next数组的方法呢?

假设next[i] == k,则有 s[0]s[1]…s[k-1] == s[x]…s[i-1];如果s[k] == s[i],则s[0]…s[k] == s[x]…s[i];则next[i+1] == k+1;如果s[k] != s[i], k要不断回退到next[k],直到回退到-1或s[k] == s[i]为止。下面我们来写代码实现一下

void GetNext(string& s, vector<int>& next)
{
  	int i = 1;
    int k = 0;
  	while(i < s.size()-1)
    {
      	if(k == -1 || s[k] == s[i])
        {
          	next[i+1] = k+1;
          	i++;
          	k++;
        }
      	else
        {
          	k = next[k];
        }
    }
}

2.2 KMP算法实现strStr

此时我们已经求好next数组,我们让start1不回退,start2每次回退到next[start2];

int strStr(string& str, string& substr)
{
  	if(str.size() < substr.size())
    {
        return -1;
    }
  	vector<int> next(substr.size(), 0);
  	next[0] = -1;
  	GetNext(substr, next);
  	int start1 = 0;
 		int start2 = 0;
  	while(start1 < str.size())
    {
      	if(str[start1] == substr[start2])
        {
          	start1++;
          	start2++;
            if(start2 == substr.size)
            {
              	return start1 - substr.size();
            }
        }
      	else
        {
          	start2 = next[start2];
        }
    }
  	return -1;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试(三)——黑盒测试

一、测试用例的基本要素 测试环境、操作步骤、测试数据、预期结果 测试用例的好处&#xff1a; 1.能提高测试效率、节省测试时间 2.测试用例是自动化测试用例的前提 二、测试用例的设计方法 2.1基于需求进行测试用例设计 2.2具体的设计方法 2.2.1等价类 有效等价类&#x…

c++学生信息管理系统

前言 c课程作业–学生信息管理系统 在 原博客C通讯录管理系统 https://www.csdn.net/tags/OtDagg2sODU2Ni1ibG9n.html 的基础上进行了一点修改。 学生信息管理系统 基本功能要求&#xff1a; 能使用文件的打开&#xff0c;关闭&#xff0c;读写等操作&#xff0c;实现 1.连…

STM32单片机(六)TIM定时器 -> 第八节:TIM编码器练习(编码器接口测速)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

Linux学习入门笔记

计算机硬件 计算机五大基本部件 控制器 -----> 协调各个部件运算器 -----> 算术、逻辑运算存储单元 ----->内存、外存输入单元输出单元 cup 由控制器、运算器组成 计算机操作系统 操作系统 OS 管理和控制计算机系统中的硬件和软件资源&#xff0c;用于在用户与系统…

gitLens插件简单使用

1.安装 在vscode中的插件管理输入如下后下载 GitLens — Git supercharged 2.配置 点击文件--首选项--设置 点击右上角设置小图标 3.github使用 首先仓库文件一定是要git init是git所管理的 1.在代码文件夹下使用git init创建仓库 2.打开vscode的git管理 3.点击添加暂存区…

Triton教程 --- 优化

Triton教程 — 优化 文章目录 Triton教程 --- 优化优化设置动态批处理程序模型实例 特定于框架的优化带有 TensorRT 优化的 ONNX (ORT-TRT)具有 OpenVINO 优化的 ONNXTensorFlow 与 TensorRT 优化 (TF-TRT)TensorFlow JIT 图优化TensorFlow 自动 FP16 优化 NUMA优化主机策略 Tr…

python找出所有重复数字的三位数(如110)注意重复数字(如111除外) ​要求打印所有满足条件的三位数及个数,每行打印五个

一、编程题目 python找出所有重复数字的三位数&#xff08;如110&#xff09;注意重复数字&#xff08;如111除外&#xff09; ​要求打印所有满足条件的三位数及个数&#xff0c;每行打印五个。 二、实现思路 要实现判断数字是否重复&#xff0c;脑袋里的第一反应就是使用循环…

在办公套件 ONLYOFFICE 中使用 AI 插件:自动生成文本/图片、单词释义、翻译等

想必大家多少都体验过各种人工智能应用&#xff0c;它们跟办公套件结合简直就是打工人和学生们的王炸。除了在Office全家桶中可以使用AI插件&#xff0c;在开源办公套件 ONLYOFFICE 中也能使用它。 什么是 ONLYOFFICE ONLYOFFICE 是一个开源办公套件&#xff0c;由总部位于总部…

OpenMMLab-AI实战营第二期-课程笔记-Class 4:深度学习预训练与MMPretrain

Class4&#xff1a;深度学习预训练与MMPretrain 课程链接&#xff1a;深度学习预训练与MMPretrain_哔哩哔哩_bilibili 相关repo&#xff1a;open-mmlab/mmpretrain: OpenMMLab Pre-training Toolbox and Benchmark (github.com) 文章目录 Class4&#xff1a;深度学习预训练与MM…

系统工程 - 记录一次调试USB设备低功耗应用的过程

系统工程 - 记录一次调试USB设备低功耗应用的过程 文章目录 系统工程 - 记录一次调试USB设备低功耗应用的过程需求功耗测量方法分析功耗来源LED功耗MCU功耗板子漏电 软件改善功耗调整tinyusb协议栈源码降低主频电脑唤醒usb设备退出低功耗进入STOP模式 总结 需求 最近在同客户做…

【Python 随练】寻找完数

题目&#xff1a; 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如 61&#xff0b;2&#xff0b;3.编程找出 1000 以内的所有完数。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个数学问题&#xff1a;如何找出 1000 以内的所有…

Stable diffusion WebUI txt2img使用教学

本篇文章将深入探讨如何在Stable Diffusion WebUI上进行各项参数的调整。将以txt2img为主要讨论对象&#xff0c;探讨诸如基本设定Sampling method以及CFG scale等参数的调整&#xff0c;以及这些参数之间的相互影响。 对于还未安装Stable Diffusion WebUI的小伙伴&#xff0c…

httpd的安装和mysql数据库的安装方法

目录 一 安装httpd 1.下载httpd包模块apr和apr-u到opt目录 2. 解包 3. 把apr和apr-u包放在http的第三方模块scrilb目录中 4.进入httpd包的安装目录并安装依赖环境和进行编译安装 5. make -j 2 && make install 编译并安装 6.优化配置文件 7. 把httpd服务放在sy…

智能文档图像处理技术:解决大数据时代文档图像处理难题

智能文档图像处理技术&#xff1a;解决大数据时代文档图像处理难题 0. 前言1. 智能文档处理1.1 智能文档处理简介1.2 智能文档处理应用 2. VALSE 视觉与学习青年学者研讨会2.1 VALSE 20232.2 合合信息亮相 VALSE 2023 3. 版面分析技术3.1 版面分析3.2 文档还原 4. 其他相关智能…

Gamma:强大的AI制作PPT神器,用完再也回不去了!

看过许多 AI 制作 PPT 软件&#xff0c;最终还是被 Gamma 惊艳到。 Gamma 是一款基于人工智能技术的 PPT 制作工具&#xff0c;可以帮助用户轻松制作高质量的 PPT 演示文稿。 痛点解决 相比传统制作 PPT 方式&#xff0c;Gamma 可以解决哪些如下 7 个痛点&#xff1a; 一句话…

2016年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2016年1月真题&#xff1a; 四、写作&#xff1a;第56~57小题&#xff0c;共65 分。其中论证有效性分析30 分&#xff0c;论说文35分。 56、论证有效性分析&#xff1a; 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0…

2013年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2013年1月真题: 四、写作:第 56~57小题&#xff0c;共65分。其中论证有效性分析30 分&#xff0c;论说文35 分。 56、论证有效性分析: 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600 字左右的文章&#xff0c;对该论证的有效性进行分析和评论…

Golang每日一练(leetDay0102) 删除无效的括号、累加数

目录 301. 删除无效的括号 Remove Invalid Parentheses &#x1f31f;&#x1f31f;&#x1f31f; 306. 累加数 Additive Number &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏…

使用mpi并行技术实现wordcount算法

【问题描述】 编写程序统计一个英文文本文件中每个单词的出现次数&#xff08;词频统计&#xff09;&#xff0c;并将统计结果按单词字典序输出到屏幕上。 注&#xff1a;在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。 【输入形…

iPhone手机用户们在用的手机桌面便签推荐哪款?

iPhone手机的性能和外观设计是非常好的&#xff0c;很多人在工作和生活中都少不了它的辅助。有人在工作生活中担心会忘掉一些重要的事&#xff0c;在这种情况下可以用便签软件来帮自己把这些重要的事情记录下来。iPhone手机用户们在用的手机桌面便签推荐哪款&#xff1f; 其实…