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()的更多相关文章

  1. 前端与算法 leetcode 28.实现 strStr()

    # 前端与算法 leetcode 28.实现 strStr() 题目描述 28.移除元素 概要 这道题的意义是实现一个api,不是调api,尽管很多时候api的速度比我们写的快(今天这个我们可以做到和 ...

  2. <每日 1 OJ> -LeetCode 28. 实现 strStr()

    题目: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存 ...

  3. Java实现 LeetCode 28 实现strStr()

    28. 实现 strStr() 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 ...

  4. 44. leetcode 28. Implement strStr()

    28. Implement strStr() Implement strStr(). Returns the index of the first occurrence of needle in ha ...

  5. [LeetCode] 28. Implement strStr() ☆

    Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...

  6. [LeetCode] 28. Implement strStr() 实现strStr()函数

    Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...

  7. LeetCode 28 Implement strStr() (实现找子串函数)

    题目链接: https://leetcode.com/problems/implement-strstr/?tab=Description   Problem : 实现找子串的操作:如果没有找到则返回 ...

  8. leetcode 28. 实现 strStr()

    问题描述 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不 ...

  9. Leetcode #28. Implement strStr()

    Brute Force算法,时间复杂度 O(mn) def strStr(haystack, needle): m = len(haystack) n = len(needle) if n == 0: ...

  10. Java [leetcode 28]Implement strStr()

    题目描述: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ...

随机推荐

  1. GitOps实践之kubernetes安装argocd

    1. 什么是argocd 1.Argo CD是Kubernetes的一个声明性GitOps持续交付工具. 2.应用程序定义.配置和环境应该是声明性的和版本控制的.应用程序部署和生命周期管理应自动化.可 ...

  2. TabControl控件的简单使用-添加tab

    1.首先创建一个MFC对话框框架,在对话框资源上从工具箱中添加上一个Tab Control 控件,根据需要修改一下属性,然后右击控件,为这个控件添加一个变量,将此控件跟一个CTabCtrl类变量绑定在 ...

  3. Django框架:8、聚合查询、分组查询、F与Q查询、ORM查询优化、ORM事务操作、ORM常用字段类型、ORM常用字段参数

    Django 数据库 目录 Django 数据库 一.聚合查询 二.分组查询 三.F查询与Q查询 1.F查询 2.Q查询 3.Q查询进阶操作 四.ORM查询优化 1.only与defer 五.ORM事 ...

  4. ARL灯塔系统搭建

    前言 ARL(Asset Reconnaissance Lighthouse)资产侦查灯塔,是一个良好的资产收集系统,旨在为渗透测试人员以及安全团队基于企业的网络安全能快速查找到指定企业资产中的脆弱点 ...

  5. vue3+TS 自定义指令:长按触发绑定的函数

    vue3+TS 自定义指令:长按触发绑定的函数 而然间看到一个在vue2中写的长按触发事件的自定义指定,想着能不能把他copy到我的vue3项目中呢. 编写自定义指令时遇到的几个难点 1.自定义指令的 ...

  6. 真正“搞”懂HTTP协议07之body的玩法(实践篇)

    我真没想到这篇文章竟然写了将近一个月,一方面我在写这篇文章的时候阳了,所以将近有两周没干活,另外一方面,我发现在写基于Node的HTTP的demo的时候,我不会Node,所以我又要一边学学Node,一 ...

  7. P5687 [CSP-S2019 江西] 网格图

    题面 给定一个 \(n\times m\) 的网格图,行从 \(1\sim n\) 编号,列从 \(1\sim m\) 编号,每个点可用它所在的行编号 \(r\) 与所在的列编号 \(c\) 表示为 ...

  8. 使用动态输出打印内核的DEBUG信息

    简介 printk()是很多嵌入式开发者喜欢用的调试手段之一,但是,使用printk()每次都要重新编译内核,很不方便.使用动态输出在不需要重新编译内核的情况下,方便的打印出内核的debug信息. 要 ...

  9. 安装postcss-px-to-viewport 配置postcss.config.js 报错Error: true is not a PostCSS plugin

    因项目需要,用户突然要坚持小屏幕也要观看大屏代码,临时解决方案是加了一个postcss-px-to-viewport ,安装过程中报错Error: true is not a PostCSS plug ...

  10. 初始rust

    安装rust 访问rust 按照步骤操作即可,安装很慢,请耐心等待 安装成功之后,请注意在命令行测试 rustc --version,cargo --version看看输出版本信息是否正常,如果不正常 ...