从零开始的LeetCode刷题日记:28. 实现 strStr()

一.相关链接

题目链接:28. 实现 strStr()

二.心得体会

1)KMP算法的思想

需要在一个字符串里找另一个字符串就需要用到KMP算法。KMP算法的重点是求出next数组,然后每次遇到不匹配的情况就根据数组来回退并重新匹配。

KMP算法的思想是最长相等前后缀,也就是省去再匹配前面子串的时间。

2)求next数组的流程

KMP算法求next数组的基本流程是:初始化,处理前后缀不匹配情况,处理前后缀匹配情况。

  1. 初始化:i设置为后缀末尾,j设置为前缀末尾(同时也代表了j前方的子串已经匹配成功),next[0]=0(第一个字母没有前后缀)。
  2. 处理前后缀不匹配的情况:如果不匹配,我们就需要一直向前回退,根据next[j-1]来一直回退到字符串头或者匹配为止(只有匹配了才说明存在某个前后缀长度相等且相同),本质就是不断缩小前后缀的长度以求找到匹配的最长相等前后缀。
  3. 处理前后缀匹配的情况:如果匹配,我们就可以j++,然后赋值next[i]=j,说明最长相等前后缀延长一位!
3)问题与思考

1. j的大小和所指字符的含义是什么?

答:j的大小指的是上一个子串已经成功匹配的最长前后缀长度。j所指字符是新加入子串的字符,代表当前需要进行匹配的后缀末尾。

2. 为什么是根据next[j-1]进行回退?

答:第一个解释是根据不变量原则,本质上求next数组也是一个小的查找子串的问题,因此和整个KMP所解决的问题是一致的,和KMP的流程是一样的。第二个解释是回退的本质是不断缩小前后缀长度的一个不断妥协的过程,这个过程我们可以逐个逐个向前回退来比较,但next数组记录了能够匹配的前缀位置,那么只需要让i所指字符和这些匹配了的前缀末尾来比较就可以确定next[i]了。

三.代码

1)实现KMP:

class Solution {
public:void getNextarray(int* next,string needle){//初始化int j=0;next[0]=0;//创建next数组for(int i=1;i<needle.size();i++){//处理前后缀不匹配情况while(j>0&&needle[i]!=needle[j]){j = next[j-1];}//处理前后缀匹配情况if(needle[i] == needle[j]){j++;}//赋值next[i] = j;}}int strStr(string haystack, string needle) {const int len = needle.size();int next[needle.size()];getNextarray(next,needle);int j=0;//进行KMP搜索for(int i=0;i<haystack.size();i++){//不匹配就根据next数组回退while(j>0&&haystack[i]!=needle[j]){j = next[j-1];}if(haystack[i]==needle[j]){j++;}if(j==needle.size()){//匹配完成后i指向neddle末尾,因此需要复位到开头return (i-needle.size()+1);}}return -1;}
};

2)库函数:

class Solution {
public:int strStr(string haystack, string needle) {auto result = search(haystack.begin(), haystack.end(), needle.begin(), needle.end());if (result != haystack.end())return (result - haystack.begin());else return -1;}
};

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

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

相关文章

十大经典排序算法及其C语言实现--带动图展示

排序算法大概算起来有以下十种 一、冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数…

python统计分析——一般线性回归模型

参考资料&#xff1a;python统计分析【托马斯】 当我想用一个或多个其他的变量预测一个变量的时候&#xff0c;我们可以用线性回归的方法。 例如&#xff0c;当我们寻找给定数据集的最佳拟合线的时候&#xff0c;我们是在寻找让下式的残差平方和最小的参数(k,d)&#xff1a; 其…

基于51单片机的秒表设计—0.01精度99.99s

基于51单片机的秒表设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.数码管显示秒表&#xff0c;精度为0.01&#xff1b; 2.记时最大为99.99s,过后清零记数。 3.一个按键实现开始…

突破传统,创新营销:淘宝天猫详情接口API的无限可能

随着互联网的迅猛发展&#xff0c;电子商务平台成为了现代商业营销的重要组成部分。淘宝和天猫作为中国最大的电子商务平台之一&#xff0c;拥有庞大的商品数据库和海量的买家资源。为了更好地实现个性化、精准化的营销策略&#xff0c;淘宝天猫推出了详情接口API&#xff0c;联…

【代码随想录】day41

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、343整数拆分二、96不同的二叉搜索树 一、343整数拆分 class Solution { public:int integerBreak(int n) {vector<int> dp(n 1, 1);for (int i 2; i &…

Kibana管理ES生命周期

希望通过Kibana界面管理ES索引的生命周期 版本&#xff1a;7.15.2 创建索引模板 创建索引模板方便匹配索引&#xff0c;对匹配到的一批索引采用同一套生命周期管理策略&#xff0c;例如开发环境的所有索引以dev-开头&#xff0c;可以创建样式为dev-*的索引模板以匹配开发环境…

【Python】——三种常用数据类型

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL:数据结构_IT闫的博客-CSDN博客 🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客 💎C++:

uni-starter和uni-admin初始化

1. 初始化uni-starter项目之后需要在uniCloud–>cloudfunctions–>common–>uni-config-center下面新增uni-id文件夹&#xff0c;下面新增config.json文件。 1.1配置好tokenSecret和微信的appId&#xff0c;appSecret等,如下&#xff1a; {"passwordSecret"…

AI教你学IT(不要再学JAVA了,都要被卷烂了)

目录 方向一&#xff1a;学习路径 1. 在线课程与自学&#xff1a; 2. 培训机构与课程&#xff1a; 3. 学历教育与进修&#xff1a; 方向二&#xff1a;技能培养 1. 编程能力&#xff1a; 2. 数据处理与分析&#xff1a; 3. 软件开发与测试&#xff1a; 方向三&#xff…

pygame旋转角度发射射线

self.x self.x math.cos(math.radians(self.xuanzhuanjiao)) * 70 self.y self.y - math.sin(math.radians(self.xuanzhuanjiao)) * 70 旋转角度&#xff0c;70是间隔 间隔太小会卡 import pygame from pygame.locals import * import sys import mathpygame.init()width, …

03-JAVA设计模式-装饰模式

装饰模式 什么装饰模式 装饰器模式&#xff08;Decorator Pattern&#xff09;也叫包装器模式&#xff0c;是一种结构型设计模式&#xff0c;允许用户在不改变对象的情况下&#xff0c;动态地给对象增加一些额外的职责&#xff08;功能&#xff09;。装饰器模式相比生成子类更…

echarts 多环形图

环形图效果&#xff1a; option {"angleAxis": {"max": 1,"show": false,"splitLine": {"show": false},"axisLabel": {"show": false},"axisTick": {"show": false}},"ra…

美国N4433A安捷伦电子校准件

181/2461/8938产品概述&#xff1a; 安捷伦N4433A微波电子校准&#xff08;ECal&#xff09;模块使矢量网络分析仪的校准变得快速、简单和准确。ECal是一种用于矢量网络分析仪的精密单连接校准技术。与机械校准套件相比&#xff0c;使用ECal进行完整的三端口或四端口校准所需的…

基于FPGA的HDMI设计导航页面

FPGA使用HDMI更多时候用于传输图像数据&#xff0c;并不会传输音频数据&#xff0c;因此以下文章均采用DVI接口协议&#xff0c;HDMI与DVI的视频传输协议基本一致&#xff0c;区别也很小。 首先需要了解HDMI的来源&#xff0c;以及物理接口类型以及引脚信号&#xff0c;最后对几…

风电用主齿轮箱市场的发展趋势和竞争格局

环洋市场咨询Global Info Research的风电用主齿轮箱市场调研报告提供风电用主齿轮箱市场的基本概况&#xff0c;包括定义&#xff0c;分类&#xff0c;应用和产业链结构&#xff0c;同时还讨论发展政策和计划以及制造流程和成本结构&#xff0c;分析风电用主齿轮箱市场的发展现…

【Java】Java使用Swing实现一个模拟计算器(有源码)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 今天翻了翻之前写的代码&#xff0c;发现自己之前还写了一个计算器&#xff0c;今天把我之前写的代码分享出来。 我记得那会儿刚学不会写&#xff0c;写的乱七八糟&#xff0c;但拿来当期末作业还是不错的哈哈。 直接上…

常用MySql下载安装使用教程

MySQL是一个流行的开源关系型数据库管理系统&#xff0c;被广泛应用于网站建设、软件开发等多个领域。它以其高性能、高可靠性和易用性&#xff0c;赢得了开发者的青睐。下面我将详细介绍MySQL的下载安装流程&#xff0c;并介绍一些常用的数据库操作命令。 一、MySQL的下载与安…

力扣404,左叶子之和

404. 左叶子之和 已解答 简单 相关标签 相关企业 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;…

C:数据结构之链栈(不带头)

目录 前序 准备工作 函数声明 函数接口 1.初始化 2.创造节点 3. 判断栈空 4.入栈 5.出栈 6.取栈顶元素 7.销毁栈 8. 获取栈的元素个数 总结 前序 链栈是基于单链表实现的,其实栈更加适合使用顺序表来实现的,这篇文章我们来探讨一下链栈的实现。 准备工作 老规…

透视 Insilico 英矽智能:AI 制药明星企业的飞跃、困境与破局

衰老&#xff0c;从古至今困扰了无数仁人志士。无论是千古一帝秦始皇&#xff0c;还是雄才大略汉武帝&#xff0c;亦或者挥斥方遒唐太宗&#xff0c;这些伟大的帝王无一例外的都留下了许多追求长生的故事。当时光的指针落在了 21 世纪的第二个十年&#xff0c;随着全球老龄化问…