【代码随想录算法训练营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

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库