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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形