【代码随想录算法训练营Day09】28.实现 strStr(); 459.重复的子字符串

本文主要是介绍【代码随想录算法训练营Day09】28.实现 strStr(); 459.重复的子字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Day 9 第四章 字符串part02
    • 28. 实现 strStr() (本题可以跳过)
      • KMP 思路
      • KMP 代码
    • 459.重复的子字符串 (本题可以跳过)
    • 字符串总结
    • 双指针回顾

Day 9 第四章 字符串part02

  • 今日任务
    • 28.实现 strStr(); 459.重复的子字符串; 字符串总结; 双指针回顾

28. 实现 strStr() (本题可以跳过)

  • 因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会
    好懂很多。
  • 或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。
  • 因为大家 算法能力还没到,细扣 很难的算法,会把自己绕进去,就算别人给解释,只会激发出更多的问题和疑惑。所以大家先了解大体过程,知道这么回事, 等自己有
    算法基础和思维了,在看多看几遍视频,慢慢就理解了。
  • 题目链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/
  • 视频讲解:1. 帮你把KMP算法学个通透!(理论篇); 2. 帮你把KMP算法学个通透!(求next数组代码篇)_哔哩哔哩_bilibili
  • 文章讲解:https://programmercarl.com/0028.%E5%AE%9E%E7%8E%B0strStr.html
  • 参考视频:https://b23.tv/2Px1QbL

KMP 思路

KMP 代码

public static int strStr(String haystack, String needle) {char origin[] = haystack.toCharArray(); //原始数组char pattern[] = needle.toCharArray();  //模式数组int next[] = next(pattern); //最长前后缀数组//System.out.println(Arrays.toString(next));/*1. 匹配成功,i++ j++,直到j==模式字符串长度2. 匹配失败j != 0 跳过最长前后缀字符,继续匹配j == 0 则 i++*/int i = 0;int j = 0;//没匹配到就一直匹配,直到模式字符串尾部和原始字符串对齐while(pattern.length - j <= origin.length - i){if(origin[i] == pattern[j]){    //匹配成功的情况i ++;j ++;} else if (j == 0) {i++;} else{j = next[j - 1];}//找到解if(j == pattern.length) return i - j;}return -1;
}/*最长前后缀数组:只跟模式字符串有关1. 索引:使用了模式字符串前j个字符串-12。 值:最长前后缀的长度(恰好是匹配失败时j要跳转的位置)*/
public static int[] next(char[] pattern){//return new int[]{0,0,1,2,3,0,1};int next[] = new int[pattern.length];int i = 1;int j = 0;/*遇到相同的字符:记录共同前后缀长度,长度即为 j + 1长度记录至数组i索引处然后i++ j++遇到不同字符:1. 前面没有共同部分:j=02. 前面有共同部分,j向回找无需对比的地方,可以跳过无需对比的字符串个数之前已经计算过*/while(i < pattern.length){if(pattern[i] == pattern[j]){next[i] = j + 1;i ++;j ++;}else if(j == 0){i ++;}else{j = next[j - 1];}}return next;
}

459.重复的子字符串 (本题可以跳过)

  • 本题算是KMP算法的一个应用,不过 对KMP了解不够熟练的话,理解本题就难很多。
  • 我的建议是 KMP和本题,一刷的时候 ,可以适当放过,了解怎么回事就行,二刷的时候再来硬啃
  • 题目链接:https://leetcode.cn/problems/repeated-substring-pattern/
  • 视频讲解:https://www.bilibili.com/video/BV1cg41127fw/
  • 文章讲解: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://programmercarl.com/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%80%BB%E7%BB%93.html

双指针回顾

  • 此时我们已经做过10到双指针的题目了,来一起回顾一下,大家自己也总结一下双指针的心得
  • 文章讲解:https://programmercarl.com/%E5%8F%8C%E6%8C%87%E9%92%88%E6%80%BB%E7%BB%93.html

这篇关于【代码随想录算法训练营Day09】28.实现 strStr(); 459.重复的子字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/737225

相关文章

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被