代码随想录算法训练营day09 | leetcode 28. 实现 strStr()
LeetCode 28. 实现 strStr()
牢记一点:next[i] 元素表示【0,i】子串的最长相等前后缀个数,也是模式串与主串匹配不相等时模式串的下一个比较索引
分析1.0
前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串。
后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。
明确主串、模式串,当模式串与主串不一致时,模式串指针移动,可以移动到模式串第一个元素 或 非第一个元素
进而要搞懂最长相等前后缀,当指向j时,模式串[0,j]的最长相等前后缀是多少,如果是3,那next[j]=3,3是最长相等前后缀个数,而3正好是模式串下一个要比较元素的索引,而next数组从索引0开始计算,0 1 2三个索引对应最长相等前后缀,于是要比较的刚好就是第3个,很玄乎但就是这样。
可以看出模式串与前缀表对应位置的数字表示的就是:下标j之前(包括j)的字符串中,有多大长度的相同前缀后缀
j为遍历指针,只能++; i是最长相等前缀的最后一个元素的索引,可向前移动 | 比较过程可以说是模式串自己比自己
class Solution {
public int strStr(String haystack, String needle) {
int i = 0, j = 0;
int[] next = getNext(needle);
while(i < haystack.length() && j < needle.length()){
if(haystack.charAt(i) == needle.charAt(j)){
i++;
j++;
}else{
// 比到模式串第一个还不等 那只能为0了
if (j == 0 && next[j] == 0){
i++;
continue;
}
// 这是关键
j = next[j-1];
}
}
int pos = i - needle.length();
//System.out.println(pos);
return j == needle.length() ? pos : -1;
}
int[] getNext(String s){
int len = s.length();
int[] next = new int[len];
// 一个元素没有前缀
next[0] = 0;
// i指向前缀末尾 j遍历模式串,遍历时计算next[j] 表示在模式串、主串比较过程中,如果不匹配,j应该怎么移动
int i = 0, j = 1;
while(j < len){
if(s.charAt(j) == s.charAt(i)){
// 相等 意味着最长相等前后缀又多了一个 而此时最长相等前后缀有i个 赋值后 i j都要后移一位
next[j++] = i++ + 1; // ++i也可
}else{
// 不等了,应该向前移动i指针,找到可能和j指针相等的那个元素
// 如果i移动到了第一个元素还不相等
if (i == 0 && next[i] == 0) {
next[j++] = 0;
continue;
}
// 求前i-1个元素的最长相等前后缀个数,个数正好就是下一个i的索引 玄乎
i = next[i-1];
}
}
// System.out.println(Arrays.toString(next));
return next;
}
}
代码随想录算法训练营day09 | leetcode 28. 实现 strStr()的更多相关文章
- 前端与算法 leetcode 28.实现 strStr()
# 前端与算法 leetcode 28.实现 strStr() 题目描述 28.移除元素 概要 这道题的意义是实现一个api,不是调api,尽管很多时候api的速度比我们写的快(今天这个我们可以做到和 ...
- <每日 1 OJ> -LeetCode 28. 实现 strStr()
题目: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存 ...
- Java实现 LeetCode 28 实现strStr()
28. 实现 strStr() 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 ...
- 44. leetcode 28. Implement strStr()
28. Implement strStr() Implement strStr(). Returns the index of the first occurrence of needle in ha ...
- [LeetCode] 28. Implement strStr() ☆
Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
- [LeetCode] 28. Implement strStr() 实现strStr()函数
Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...
- LeetCode 28 Implement strStr() (实现找子串函数)
题目链接: https://leetcode.com/problems/implement-strstr/?tab=Description Problem : 实现找子串的操作:如果没有找到则返回 ...
- leetcode 28. 实现 strStr()
问题描述 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不 ...
- Leetcode #28. Implement strStr()
Brute Force算法,时间复杂度 O(mn) def strStr(haystack, needle): m = len(haystack) n = len(needle) if n == 0: ...
- Java [leetcode 28]Implement strStr()
题目描述: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ...
随机推荐
- 【collection】1.java容器之HashMap&LinkedHashMap&Hashtable
Map源码剖析 HashMap&LinkedHashMap&Hashtable hashMap默认的阈值是0.75 HashMap put操作 put操作涉及3种结构,普通node节点 ...
- 谈谈我的「数字文具盒」 - NextCloud
接下来两篇主要谈论 Nextcloud 和 Obsidian,因为篇幅较长,所以单出罗列出来.本文主要介绍 Nextcloud 以及使用中的技巧和心得体会. Nextcloud Nextcloud 是 ...
- RFN-Nest_ An end-to-end residual fusion network for infrared and visible images 论文解读
RFN-Nest 2021 研究 图像融合分为三步:特征提取,融合策略,图像重建. 当前端到端的图像融合方法:基于GAN的.还有本文提出的 研究背景:当前设计的融合策略在为特定任务生成融合图像方面是比 ...
- Flaks框架(g对象,session,数据库连接池,信号,flask-script,SQLAlchemy(ORM))
目录 一:g对象 简介 1.g对象和session的区别 2.g对象实战代码 二:flask-session(借助于第三方插件连接redis保存session ) 1.方式一: 2.方式二(flask ...
- Python 什么是flask框架?快速入门(flask安装,登录,新手三件套,登录认证装饰器,配置文件,路由系统,CBV)
目录 一:Python flask框架 前言 补充一下,我们前面学习的库都是叫模块,那么框架与库的区别? 二:flask 框架概述 1.简介 2.须知: 3.flask框架的优势 三:flask 安装 ...
- js实现n秒内只能点击一次操作
<button @click="submit">5秒内只能点一次</button>
- Go语言与其他高级语言的区别
概述: go语言与其他语言相比,go语言的关键字非常少,只有25个,c语言有37个,c++有84个,python有33个,java有53个. 差异1:go语言不允许隐式转换,别名和原有类型也不能进行隐 ...
- 使用jquery—Canvas实现html5小游戏——《坦克大战》
目录 1.项目背景 2.项目展示 3.设计思路 3.1.坦克移动 3.2.坦克开火 3.3.击中坦克 4.实现代码 5.总结 1.项目背景 2021年春节期间在家无聊,正好又学过一些前端的知识,因此就 ...
- JavaWeb项目编译前后的目录结构
JavaWeb项目编译前后的目录结构 编译前 页面和视图都放在webapp目录下 编译后 webapps WEB-INF
- ArcGIS工具 - 批量删除空图层
为了减少数据的冗余,我们经常需将数据库中的空图层(没有任何记录的要素类或表)删除,删除数据本来是一个很简单的操作,但如果数据量大,则需通过程序来处理.例如,删除成百上千个标准分幅DLG数据库中等高线数 ...