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. vulnhub靶场之HACK ME PLEASE

    准备: 攻击机:虚拟机kali.本机win10. 靶机:HACK ME PLEASE,下载地址:https://download.vulnhub.com/hackmeplease/Hack_Me_Pl ...

  2. JavaEE Day12 Xml

    今日内容Xml 1.概念 2.语法结构 3.解析xml 一.XML概述 1.概念 Markup Language Extensible Markup Language--可扩展标记语言 标记语言:标签 ...

  3. 【面试题总结】Java并发-多线程、JUC详述(思维导图)

    〇.整体目录 一.多线程 1.实现方式 2.内存图 3.线程状态 4.实现线程同步 5.并发编程 二.JUC 1.概述与volatile关键字 2.ThreadLocal类 3.CAS方法 4.ato ...

  4. forms组件源码剖析

    一:forms组件源码剖析 1.forms组件源码切入点: 1.0 form_obj.is_valid() 2.0 def is_valid(self): """ Ret ...

  5. 深入解读MySQL InnoDB存储引擎Update语句执行过程

    参考b站up 戌米的论文笔记 https://www.bilibili.com/video/BV1Tv4y1o7tA/ 书籍<mysql是怎样运行的> 极客时间<mysql实战45讲 ...

  6. java中加号的用法

    注意java中+号的使用 public class Add { public static void main(String[] args) { System.out.println(100+80); ...

  7. APP异常测试点汇总

    在测试APP时异常测试是非常必要的. 安装卸载中的异常测试 一.安装 安装过程中设备重启 安装过程中息屏 安装过程中断网 安装过程中切换网络 安装过程中收到短信提醒 安装过程中收到来电提醒 安装过程中 ...

  8. 交互式仪表板!Python轻松完成!⛵

    作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 本文地址:https://www.showmeai.tech/artic ...

  9. Node.js躬行记(26)——接口拦截和页面回放实验

    最近在研究 Web自动化测试,之前做了些实践,但效果并不理想. 对于 QA 来说,公司的网页交互并不多,用手点点也能满足.对于前端来说,如果要做成自动化,就得维护一堆的脚本. 当然,这些脚本也可以 Q ...

  10. cookie、session,、token,还在傻傻分不清?

    摘要:session 和 token 本质上是没有区别的,都是对用户身份的认证机制,只是他们实现的校验机制不一样而已. 本文分享自华为云社区<Session/Cookie/Token 还傻傻分不 ...