算法刷题Day9 | 28. 实现 strStr()、459.重复的子字符串、字符串总结

news2024/11/18 6:41:47

目录

  • 0 引言
  • 1 实现 strStr()
    • 1.1 我的解题
    • 1.2 KMP算法解题
  • 2 重复的子字符串
    • 2.1 暴力求解
    • 2.2 KMP求解法
  • 3 字符串总结

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:算法刷题Day8 | 28. 实现 strStr()、459.重复的子字符串、字符串总结
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

0 引言

1 实现 strStr()

  • 🎈 文档讲解:https://programmercarl.com/0028.%E5%AE%9E%E7%8E%B0strStr.html
  • 🎈 视频讲解:最浅显易懂的 KMP 算法讲解
  • 🎈 做题状态:KMP算法的next数组的求解还是有点懵

1.1 我的解题

暴力解题:直接两个循环

class Solution {
public:
    int strStr(string haystack, string needle) {
        for(int i = 0; i < haystack.size(); i++)
        {
            int j = 0;
            for (; j < needle.size(); j++)
            {
                if (haystack[i+j] != needle[j])
                {
                    // 如果第一个数都不匹配,则直接跳出循环
                    break;
                }
            }
            // 如果全部的数都匹配,则此时 j == needle.size()
            if (j == needle.size())
            {
                return i;
            }
        }

        return -1;
    }
};

1.2 KMP算法解题

KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。
在这里插入图片描述

如上图所示,只需要我们找到已经匹配过的字符串中前缀和后缀相等的个数,就知道下一次遍历,子串应该从哪个位置开始。例如下图中,在C处不匹配时,我们只需要找出 ABAB 这个字符串,最小的前后串相等的个数是多少,就知道下次遍历子串该从哪个位置开始。 对于 ABAB 字符串,可以得知最小前后串相等的个数是2。所以子串从 (2+1)的位置开始遍历,也就是从 索引为 2 的位置开始遍历。因为主串中末尾匹配的字符对应 ABAB 的后缀。而我们已经知道 ABAB 的 AB前缀和AB后缀是相等的。所以此时 AB 前缀也就不需要再和主串中末尾的 AB 进行比较了。

在这里插入图片描述

现在知道匹配的基本原理后,下一步的任务就是求解 前缀表 也就是子串中当前字符前面的字符串的相同前后缀的长度是多少。也就是next数组。

在这里插入图片描述

使用递推求解next数组:

next数组(前缀表)求解的步骤:
初始化、前后缀不相同的情况、前后缀相同的情况、更新next数组

  1. 初始化,两个索引值,分别指向前缀末尾(索引 j )和后缀末尾(索引 i )。首先初始化 j=0; next[0] = 0;
  2. 遍历 i ,当前后缀不相等时,
  

2 重复的子字符串

  • 🎈 文档讲解:https://programmercarl.com/0459.%E9%87%8D%E5%A4%8D%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.html
  • 🎈 视频讲解:https://www.bilibili.com/video/BV1M5411j7Xx/?spm_id_from=333.788&vd_source=d499e7f3a8e68e2b173b1c6f068b2147
  • 🎈 做题状态:

2.1 暴力求解

2.2 KMP求解法

3 字符串总结

字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。

在C语言中,把一个字符串存入一个数组时,也把结束符 '\0’存入数组,并以此作为该字符串是否结束的标志。
在使用 string 的时候直接把他看作一个字符数组会便于理解。

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

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

相关文章

画图实战-Python实现某产品全年销量数据多种样式可视化

画图实战-Python实现某产品全年销量数据多种样式可视化 学习心得Matplotlib说明什么是Matplotlib&#xff1f;Matplotlib特性Matplotlib安装 产品订单量-折线图某产品全年订单量数据数据提取和分析绘制折线图 产品订单&销售额-条形图某产品全年订单&销售额数据绘制条形…

【嵌入式学习】C++day03.14

一、思维导图 二、练习 成员函数版本实现算术运算符的重载 全局函数版本实现算术运算符的重载 #include <iostream>using namespace std;class Num {friend const Num operator-(const Num &L,const Num &R); private:int a;int b; public://运算符重载const …

【Linux系统编程】进程的退出与等待

进程的创建 fork()用于创建子进程。但fork创建的子进程获得的是父进程&#xff08;即调用 fork() 的进程&#xff09;的一份几乎完全相同的副本&#xff0c;包括父进程的代码、数据、堆、栈和数据结构等内容。当进程调用fork后&#xff0c;一旦控制转移到内核中的fork代码后&am…

ATTRIBUTE_HELPER_HEADER

ATTRIBUTE_HELPER_HEADER是ns3中的一个宏定义&#xff0c;用于声明类类型的属性值、访问器和检查器。 例如&#xff1a; ATTRIBUTE_HELPER_HEADER (QueueSize);此宏声明&#xff1a; 属性值类typeValue&#xff0c;属性访问器函数MaketypeAccessor&#xff0c;AttributeChec…

CesiumJS 沙盒

CesiumJS 沙盒 通过CesiumJS 沙盒快速测试CesiumJS的一些功能&#xff0c;免去安装开发环境的困恼。 Hello World https://sandcastle.cesium.com/index.html 简单修改&#xff08;F8运行&#xff09;&#xff1a;去掉界面上UI const viewer new Cesium.Viewer("cesi…

C++中的STL-string类

文章目录 一、为什么学习string类&#xff1f;1.1 C语言中的字符串 二、准库中的string类2.2 string类2.3 string类的常用接口说明2.4 string类对象的容量操作2.5 string类对象的访问及遍历操作2.5 string类对象的修改操作2.7 string类非成员函数2.8 模拟实现string 一、为什么…

C++特性之一:继承

1. 派生类的成员变量、成员函数、构造、析构 2. 继承的切片 3. 重定义/隐藏 重定义/隐藏&#xff1a;派生类和基类有同名的成员&#xff0c;就叫隐藏。派生类的成员隐藏了基类的成员。 隐藏时可以通过类作用限定符来访问被隐藏的成员。 class Person { public:void Print(){…

一文了解Spring的SPI机制

文章目录 一文了解Spring的SPI机制Java SPIServiceLoader Spring SPISpringboot利用Spring SPI开发starter 一文了解Spring的SPI机制 Java SPI SPI 全称 Service Provider Interface &#xff0c;是 Java提供的一套用来被第三方实现或者扩展的接口&#xff0c;它可以用来启用…

考研数学——高数:高斯公式

助记: 关于积分时什么时候可以将变量整体代入积分式的问题&#xff1a;在积分过程中&#xff0c;如果某一整体恒为常量&#xff0c;则可以直接替换为定值&#xff0c;常见于对线或面的积分。 而在这题&#xff0c;用高斯公式之前是面积分&#xff0c;如果有这个整体出现的话是…

寒假作业Day 11

寒假作业Day 11 一、选择题 栈满的判断&#xff1a;在链式存储结构中&#xff0c;栈的大小是动态的&#xff0c;只受限于系统分配给程序的内存大小。因此&#xff0c;理论上&#xff0c;链式栈不会因为空间不足而“满”。所以&#xff0c;不需要判断栈满。 栈空的判断&#xf…

解决VS编译中文报错 error C2001:常量中有换行符

产生原因&#xff1a;文件中有中文字符&#xff0c;但是文件是utf-8格式的&#xff0c;使用msvc编译器编译时就会产生上述错误 首先说明&#xff1a;我是通过方法2解决该问题的。 解决办法&#xff1a; 方式1&#xff1a; 通过把源文件转换为gbk编码&#xff0c;但是只能一…

TCP和UDP基础

tcp服务器及客户端链接 ucd服务器及客户端

python自学7

第二章第一节面向对象 程序的格式都不一样&#xff0c;每个人填写的方式也有自己的习惯&#xff0c;比如收集个人信息&#xff0c;可能有人用字典字符串或者列表&#xff0c; 类的成员方法 类和对象 构造方法 挨个传输值太麻烦了&#xff0c;也没有方便点的&#xff0c;有&…

4_springboot_shiro_jwt_多端认证鉴权_Redis存储会话

1. 什么是会话 所谓的会话&#xff0c;就是用户与应用程序在某段时间内的一系列交互&#xff0c;在这段时间内应用能识别当前访问的用户是谁&#xff0c;而且多次交互中可以共享数据。我们把一段时间内的多次交互叫做一次会话。 即用户登录认证后&#xff0c;多次与应用进行交…

WPF —— Calendar日历控件详解

1&#xff1a; Calendar的简介 日历控件用于创建可视日历&#xff0c;让用户选择日期并在选择日期时触发事件。 DisplayMode 用来调整日历显示模式&#xff0c;分为Month、Year 和Decade 三种。如下是None 2&#xff1a;Calendar控件常用的属性 SelectionMode 选中日历的类…

原生php单元测试示例

下载phpunit.phar https://phpunit.de/getting-started/phpunit-9.html 官网 然后win点击这里下载 新建目录 这里目录可以作为参考&#xff0c;然后放在根目录下 新建一个示例类 <?phpdeclare(strict_types1);namespace Hjj\DesignPatterns\Creational\Hello;class He…

Python实战:爬取小红书

有读者在公众号后台询问爬取小红书&#xff0c;今天他来了。 本文可以根据关键词&#xff0c;在小红书搜索相关笔记&#xff0c;并保存为excel表格。 爬取的字段包括笔记标题、作者、笔记链接、作者主页地址、作者头像、点赞量。 一、先看效果 1、爬取搜索页 2、爬取结果保存到…

在IDE中配置tomcat服务器

目录 一、新建一个java项目二、添加web框架三、配置tomcat服务器四、运行访问发布的项目 前言&#xff1a;在 IntelliJ IDEA 中配置 Tomcat 服务器是 Java Web 开发的基础步骤&#xff0c;以下是如何在 IDEA 中设置 Tomcat 并部署 Web 项目的简要指南。 一、新建一个java项目 新…

DVWA-master 存储型xss

什么是存储型xss 存储型xss意味着可以与数据库产生交互的&#xff0c;可以直接存在数据库中 先将DVWA安全等级改为低 先随便写点东西上传 我们发现上传的内容会被显示&#xff0c;怎么显示的呢&#xff1f; 它先是上传到数据库中&#xff0c;然后通过数据库查询语句将内容回显 …

TSINGSEE青犀AI烟火识别等算法打造电瓶车消防安全解决方案

一、背景分析 根据国家消防救援局的统计&#xff0c;2023年全国共接报电动自行车火灾2.1万起&#xff0c;相比2022年上升17.4%&#xff0c;电动自行车火灾安全隐患问题不容忽视。 电瓶车火情主要问题和原因&#xff1a; 电瓶车/电池质量良莠不齐用户安全意识薄弱&#xff0c…