【代码随想录】刷题Day9 --- 我有自信讲清楚KMP的next原理

news2025/2/27 20:52:15

字符串 --- 找子串匹配算法_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130197908?spm=1001.2014.3001.5501

 首先具体KMP算法理论在上面的博客中,不过该博客我当初写的时候并没有了解next数组实现的过程是那样的,所以只介绍了KMP的理论,next理论没有细致的给出

1.实现strStr()

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

这里我将解释我自己对于next数组的理解

先定个规矩,next[0]为-1

1.因为0位置不需要判断它跟谁一样,其实是一个能表示为初始位置的值就行。

2.但是我们不满足于表示为初始位置,因为我们查下标还要用到,所以可选-1,0这些值。

3.而之所以要选-1,因为我们把一个位置对应的相同前缀串情况,存到后一个位置去了。next有很多实现方式,但是我要实现的是开头为-1。

4.后面一个的next值表示前面的相同前缀串情况。(后续解决) 正因为如此,-1表示前面是空白

再定个规矩,next[1]为0

1.因为1位置起才开始算,1位置前面只有一个符号

2.上面也讲了后面一个的next值表示前面的相同前缀串情况。所以1位置前面就一个数,0位置的字符自己跟自己不用比,因此直接记为0

next数组后一个其实是用来存储某个位置的结果

1.简单说,这个位置的next数值代表前几个数据是对上的(看图很清楚)

此时,应该很清楚,某位置反映前面的相同前缀长了吧!!!

而且更重要的一点是,对上前缀的结果位置的next正好是开头对齐的后一个位置(比如右下角p的next值为2,数组下标2位置前就是对上的前缀)!!![这点是后面实现的核心]

2.所以这次的判断会决定下一次的next结果(核心问题单独讨论)

如何才能让,所谓判断会决定下一次的next结果

1.在循环外,先将0位置next为-1

2.i设置为next的下标,j处理后是填入next数组的数据,我们需要做的就是用i来遍历next,并且将j值赋给next数组。使用while语句,更方便控制。

3.循环开始前的最后准备:由于开始i=0,j就应该是-1,这样就匹配上数组i位置值为j

4.由于一个位置反映前面的情况,我们是由0开始的,那么就是由i定i+1位置的next值。

5.如果j==-1,说明是i是0位置,那么我们要做的就是把1位置的next赋值为0,简单将就是next[++i]=++j;这样i往后走了,j也是i往后走对应的next值

6.此时是最关键的一步

我们的 i 往后走了一步,现在要确定的就是i+1反映的是 i 跟前面内容的关系

假设我们已经得到了很多next值了,其本质我们也清楚了

1.最简单的就是i位置和对应j下标位置的值一样,说明此时最长前缀后面加一个字符,它也是对上的,那么其实++i位置的next等于++j

2.不相等,则更新将j更新为k,因为此时两边是对不上的,那么后面那一串就没有意义了,需要重新和前面的部分对应。但是前面部分我们已经知道情况了,所以j更新到k位置,那么更新后j的k值又会回到上面的判断(判断i+1位置和j对应的k位置到底对不对的上)。如果找不到就循环第二步,找到就走第一步。

class Solution {
public:
    void getNext(string& needle,vector<int> &next)
    {
        next[0]=-1;
        int i=0, j=-1;
        while(i<needle.size()-1)
        {
            if(j==-1||needle[i]==needle[j]){
                next[++i]=++j;
            }
            else
            {
                j=next[j];
            }   
        }
    }

    int getTarget(string& haystack, string& needle,vector<int> &next)
    {
        int i=0,j=0;
        while(i<haystack.size())
        {
            if(haystack[i]==needle[j])
            {
                if(j==needle.size()-1)
                    return i-j;
                i++;
                j++;
            }
            else if(j==0)
            {
                i++;
            }
            else
                j=next[j];
        }
        return -1;
    }

    int strStr(string haystack, string needle) {
        vector<int> next(needle.size(),0);
        getNext(needle,next);
        return getTarget(haystack,needle,next);
    }
};

2.重复的子字符串

​​​​​​459. 重复的子字符串

实现其实很简单,s加成一倍,掐头去尾。如果还能在这个字符串里找到s就说明是重复的,反之不是。

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        string tmp(s.begin()+1,s.end());
        tmp+=s;
        tmp.erase(tmp.size()-1);
        cout<<tmp;
        if(tmp.find(s)==string::npos)
            return false;
        return true;
    }
};

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

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

相关文章

【react全家桶学习】react中组件的props属性(详)

学过了vue的props属性&#xff0c;那react中的props属性如何使用呢&#xff1f; props的基本使用 我们先定义一个person组件 我们想要这三个参数动态传递进来&#xff0c;如何实现&#xff1f; 答&#xff1a;跟vue一样&#xff0c;直接在引用组件的地方进行传递即可。 在re…

Java——两个链表的第一个公共节点

题目链接 牛客网在线oj题——两个链表的第一个公共节点 题目描述 输入两个无环的单向链表&#xff0c;找出它们的第一个公共结点&#xff0c;如果没有公共节点则返回空。&#xff08;注意因为传入数据是链表&#xff0c;所以错误测试数据的提示是用其他方式显示的&#xff0…

润本“带伤”冲刺IPO,再闯“驱蚊第一股”

夏日来临&#xff0c;润本再度冲刺“驱蚊第一股”&#xff01; 今年3月&#xff0c;润本生物技术股份有限公司&#xff08;下称“润本”&#xff09;再次更新招股书&#xff0c;拟在上交所主板上市。 润本是一家多品牌家庭护理产品公司&#xff0c; 专注于驱蚊类、个人护理类…

米哈游新游正式公测!还没上线就已经“爆了”!

米哈游制作的3D冒险主题回合制策略游戏《崩坏&#xff1a;星穹铁道》&#xff0c;在2023年4月26日正式开启全平台公测。 该游戏在2021年10月27日曾开启过“始发测试”&#xff0c;后继续沉淀了两年才正式开启公测。 B站的ACG内容生态丰富&#xff0c;其中游戏相关内容当数米哈…

C++“this”指针的使用

1.this指针的引出 先看一段代码&#xff1a; class Date { public:Date(int year0,int month0,int day0){_year year;_month month;_day day;}void Print(){cout << _year << " "<< _month << " "<< _day << end…

无需公网IP 使用SSH远程连接Linux CentOS服务器【内网穿透】

文章目录 视频教程1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 本次教程我们来实现如何在外公网环境下&#xff0c;SSH远程连接家里/公司的Linux CentOS服务器&#xff0c;无需公网IP&#xff0c;也不需要设置…

SDK_examples问题汇总

CompParameter 看起来可以用 拖动中间的dialog框 调整下面的参数 GraphicsViewDropEvent 点击“模型库”或者“用户模型”会弹出如下&#xff0c;点击“中止”后退出页面 MassSpringDamperApp 成功过&#xff0c;现在点击“开始仿真”会显示仿真失败 MwBatchSimPlu…

Coremail RSAC大会观察:在邮件安全领域AI既是矛也是盾

《Coremail RSAC大会观察&#xff1a;在邮件安全领域AI既是矛也是盾》 全球网络安全界的盛会——2023年RSAC大会于当地时间4月24日-27日在美国旧金山召开&#xff0c;大会以“Stronger Together&#xff08;一起变得更强大&#xff09;”为主题&#xff0c;议程主要包含安全研…

想入门网络安全?先来看看网络安全行业人才需求!

如果你是一个想要入门网络安全行业的小白、如果你是网络安全专业在读的大学生、如果你是正在找工作的新手&#xff0c;那么这篇文章你一定要仔细看。毕竟知己知彼百战百胜&#xff0c;知道行业的人才需求才能更好得发挥自己的优势。 当你打开BOSS直聘、拉钩等招聘网站&#xf…

【CTF WriteUp】2023数字中国创新大赛网络数据安全赛道决赛WP(1)

2023数字中国创新大赛网络数据安全赛道决赛WP(1) 比赛感想 不多说了&#xff0c;还是菜&#xff0c;各种不会&#xff0c;还得学 数据安全题目 Crypto-ddddmm import os from Crypto.Util.number import * from secret import flagdef genkey(bits):p getPrime(bits)q g…

网络模型与 IO 多路复用

一、基础概念1. socket2. FD&#xff1a;file descriptor**3. 内核态和用户态 二、 IO 多路复用1. 常见的IO模型2. 同步和异步3. 阻塞和非阻塞 三、 阻塞IO四、非阻塞 IO1、针对 read 函数造成的阻塞2、针对 accept函数造成的阻塞3、 select 模型4、poll模型5、epoll模型 一、基…

点成分享丨液滴生成解决方案

电源及电线为了满足用户的液滴生成需求&#xff0c;点成生物联合cellix推出了点成生物液滴生成解决方案&#xff0c;该套装可以一站式轻松满足用户液滴生成实验的需求。 Part.01 点成小科普 液滴生成&#xff0c;是一种在具备某种几何形状的微流控芯片中使用微流控泵精确控制…

Drools 规则引擎(包括动态加载数据库中规则引擎)

Drools 规则引擎 文章目录 Drools 规则引擎前言一、规则引擎是什么&#xff1f;二、Drools 简介1.引入规则引擎前后程序架构&#xff1a;2.Drools API 开发步骤&#xff1a;在这里插入图片描述 三、Drools 快速入门1.使用项目文件作为规则引擎2.使用数据库存储规则引擎 四、Dro…

【shell脚本】条件语句

一、条件测试操作 1.1test命令与 [ ] 符号 测试表达试是否成立&#xff0c;若成立返回0&#xff0c;否则返回其它数值 1.1.1文件测试常用的测试操作符 符号作用-d测试是否为目录-e测试是否为目录或文件-f测试是否为文件-r测试当前用户是否有读取权限-w测试当前用户是否有写…

2023-4-27-深入理解C++指针类型间强制转换

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

【致敬未来的攻城狮计划】— 连续打卡第十四天:FSP固件库开发延时函数(时钟详解)

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

数据结构_线性表、顺序表、单链表

目录 1. 线性表的定义和基本操作 1.1 线性表的定义 1.2 线性表的特点 1.3 线性表的基本操作 2. 线性表的顺序表示 2.1 顺序表的定义 2.2 顺序表上基本操作的实现 2.2.1 插入操作 2.2.2 删除操作 2.2.3 按值查找 2.3 相关练习巩固 3. 线性表的链式表示 3.1 单链表的…

Zynq-7000、FMQL45T900的GPIO控制(五)---linux应用层配置GPIO输出控制

上文中详细阐述了对应原理图MIO/EMIO的编号&#xff0c;怎么计算获取linux下gpio的编号 本文涉及C代码上传&#xff0c;下载地址 Zynq-7000、FMQL45T900的GPIO控制c语言代码资源-CSDN文库 本文详细记录一下针对获取到gpio的编号&#xff0c;进行配置输出模式&#xff0c;并进…

RobotFramework——创建项目

创建项目 实际上在Robot Framework中创建测试项目和创建单元测试项目是一致的。 robotunittest(python)Test ProjectTest ProjectTest SuitTest SuitTest CaseTest Case 1、创建测试项目 选择菜单栏 file —> New Project Name输入"TestRobot01"&#xff1b;…

从奈奎斯特采样定理推导FMCW雷达系统性能参数

本文编辑&#xff1a;调皮哥的小助理 上文从FMCW毫米波雷达系统的性能参数理解4D成像毫米波雷达的设计思路&#xff0c;谈到关于设计4D毫米波成像雷达的思路&#xff0c;其实我还忽略了一点&#xff0c;在这里补充说明一下。 在文中谈到的最小化公式中&#xff0c;分母的有效带…