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个字符串-1
2。 值:最长前后缀的长度(恰好是匹配失败时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=0
2. 前面有共同部分,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
暂时跳过
字符串总结
双指针回顾
- 此时我们已经做过10到双指针的题目了,来一起回顾一下,大家自己也总结一下双指针的心得
- 文章讲解:https://programmercarl.com/%E5%8F%8C%E6%8C%87%E9%92%88%E6%80%BB%E7%BB%93.html