本文主要是介绍【代码随想录算法训练营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.重复的子字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!