代码训练营第22天|补第9天的KMP算法,28. 找出字符串中第一个匹配项的下标|459.重复的子字符串

news/2024/10/23 17:31:56/文章来源:https://www.cnblogs.com/VickyWu/p/18457756

前置知识

文章链接:https://programmercarl.com/0028.实现strStr.html#思路

  • KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。
  • 前缀表:next数组就是一个前缀表(prefix table)。前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。next数组也可以是前缀表加一之后的结果,方便进行代码的实现。

28. 找出字符串中第一个匹配项的下标

题目链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/
视频链接:https://www.bilibili.com/video/BV1PD4y1o7nd/

KMP算法:

总结:此题分两部分:先求next数组,接着进行匹配。

  1. 以下next数组的求法中,我将j=0,i=1;并设每一个数组元素表示除这个元素之外的前面的数组的最长公共前后缀
    所以next[0]=-1;next[1]=0是固定的
    关于怎么求next数组推荐:https://www.youtube.com/watch?v=GTJr8OvyEVQ
  2. 在文本串和模式串匹配的过程中,文本串是一个一个的向后移动并进行比较的,所以时间复杂度是n,加上模式串求解next数组的时间复杂度m,所以总的时间复杂度为O(m+n)
class Solution {
public:vector<int> getNext(string needle){int j=0;int len=needle.size();vector<int> next;//初始化,next前两个元素值是固定的(next元素值表示除它之外前面子数组的最大公共前后缀)next.push_back(-1);next.push_back(0);for(int i=1;i<len-1;i++){//当前后缀不相等,j向后回退while(j>0&&needle[j]!=needle[i]){j=next[j];//回到当前j所指向的next数组元素值对应的下标处}if(needle[j]==needle[i]) j++;next.push_back(j);}return next;}int strStr(string haystack, string needle) {vector<int> next=getNext(needle);int res=-1;int lenH=haystack.size();int lenN=needle.size();int i=0,j=0;//出口为,既没有匹配成功,i也到了lenHfor(i;i<lenH;i++){//不匹配,j回退,直到j=0或匹配为止while(j>0&&haystack[i]!=needle[j]){j=next[j];}//匹配的时候,j++if(haystack[i]==needle[j]) j++;//一旦出现了j=lenN,说明匹配成功,此时还没有i++if(j==lenN) {res=i-j+1;return res;}}return res;}
};

459.重复的子字符串

文章链接:https://programmercarl.com/0459.重复的子字符串.html#算法公开课
视频链接:https://www.bilibili.com/video/BV1cg41127fw
题目链接:https://leetcode.cn/problems/repeated-substring-pattern/description/

方法一:移动匹配
s + s ,并刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。
方法二:KMP算法
要点:最长前后缀剩余部分即可能为最小重复子串(剩余部分不可比s的一半的长度还大)
另外,如果剩余部分不可整除s,则说明也没有最小重复子串
例如:

由于这个题在解决的函数中需要用到前缀表,所以对于右移一位的next数组,最好不右移,直接使用前缀表表示的next数组。

class Solution {
public:vector<int> getNext(string s){int j=0,i=1;vector<int> next;//初始化next数组的头元素值(固定的)next.push_back(0);for(int i=1;i<s.size();i++){//不相等while(j>0&&s[i]!=s[j]){j=next[j-1];}if(s[i]==s[j]) j++;next.push_back(j);}return next;}bool repeatedSubstringPattern(string s) {vector<int> next=getNext(s);int size=next.size();int remain=size-next[size-1];//如果没有公共前后缀,或remain整除s,则falseif(next[size-1]==0||size%remain!=0) return false;return true;}
};

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

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

相关文章

中国大学mooc慕课视频课件课程下载工具,如何在电脑端下载中国大学mooc慕课视频课程课件资料到本地?

一. 安装中国大学mooc慕课课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/icourse163_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用…

【网课下载教程】网课视频下载攻略:让学习更高效

在当今互联网时代,在线学习已成为越来越多人的选择。有时,我们希望离线观看网课视频,以避免网络不稳定等问题。本文将为您提供一篇详细的网课视频下载教程,助您更高效地学习。 一、为什么下载网课视频?无需依赖网络:下载后的视频可以在没有网络的情况下观看,便于在交通工…

Mesh Renderer

网格渲染器 (Mesh Renderer) 网格渲染器从网格过滤器 (Mesh Filter) 获取几何体,然后在游戏对象的变换组件所定义的位置渲染该几何体。Materials Materials 部分列出了 Mesh Renderer 当前使用的所有材质。从3D建模软件导入的网格可以使用多种材质,而每个子网格使用列表中的一…

CIM+全场景应用,铸就智慧城市发展新篇

在数字化浪潮的推动下,智慧城市建设正成为全球城市发展的新趋势。而CIM(城市信息模型)作为智慧城市建设的核心,正以其强大的数据集成和分析能力,引领着城市发展的新篇章。今天,让我们一起探讨CIM+全场景应用如何助力智慧城市的建设。1. CIM的定义与重要性CIM是一种集成了…

【故障公告】数据库服务器 CPU 100% 造成全站故障

非常抱歉,今天下午 16:03~16:33 期间,我们使用的阿里云 RDS 实例(SQL Server2016 标准版,16核32G)出现 CPU 100% 问题,造成全站无法正常访问,由此给您带来很大的麻烦,请您谅解。 发现故障后,我们通过阿里云 RDS 控制台进行了主备切换,由于 CPU 被占太满,主备切换失败…

手把手教你如何下载高途和途途上面已购买的视频课程

前言:很多同学都想知道高途课堂/途途课堂/高途高中规划的视频课程怎么下载,但是高途上面已购买的视频课程是不提供直接下载方式的,所以下面就教大家如何用学无止下载器下载高途上面已购买的视频课程。 一、下载器首页输入G回车,再输入对应的APP序号并按回车,提示登录,再输…

中公网校上买的课程快过期了怎么办?教你如何下载到本地永久观看~

前言:很多同学都遇到过购买的网课课程过期了,然后无法观看,花了钱还没学完,血亏。这里教大家一种方法,把中公网校上面快过期的课程下载到电脑本地,然后可以永久观看了~ 提示:操此方法需要使用Windows电脑,Mac还不支持 一、电脑登录中公网校官网(点此登录中公网页)二、…

给大家介绍一个快速拉取代码的方法

1、我们安装好git之后、复制应用的ssh密钥。进入想保存本地的目录即可、等待一会、密钥认证成功。(我这里是在D盘、researchAndDe...目录)2、使用CD命令、进入想拉取代码的应用 3、使用“git checkkout 分支名称”,等待提示Switched to a new branch 拉取代码成功4、进入ide…

给大家介绍一个快速拉去代码的方法

1、我们安装好git之后、复制应用的ssh密钥。进入想保存本地的目录即可、等待一会、密钥认证成功。(我这里是在D盘、researchAndDe...目录)2、使用CD命令、进入想拉去代码的应用 3、使用“git checkkout 分支名称”,

Cinemachine系列——CinemachineConfiner

使用Cinemachine Confiner扩展可以限制相机的位置在特定的体积或区域内。 Confiner可以在2D或3D模式下工作,不同的模式影响它接受的边界形状。在3D模式下,相机在三维空间中的位置被限制在一个体积内,这同样适用于2D游戏,但需要考虑深度。在2D模式下,深度问题不需要考虑。 …

网站模板可以自己修改吗?

网站模板通常是可以根据个人或企业的具体需求进行自定义修改的。以下是一些常见的修改方式:修改样式:通过编辑CSS文件来改变网站的颜色、字体、布局等视觉效果。 调整结构:在HTML或相应的模板文件中添加或删除元素,以适应不同的页面布局需求。 功能增强:利用JavaScript或其…

网站搭建教程

1.领取免费服务器,推荐SanFengyun免费服务器。2.服务器安装BT面板,然后一键部署网站 3.也可以自己上传源码到网站。 4.绑定域名,服务器将域名加入白名单。 5.部署SLL证书。