找出字符串中第一个匹配项的下标

题目:LeetCode.28

写法一:暴力循环

class Solution {public int strStr(String haystack, String needle) {int m = needle.length();// 当 needle 是空字符串时我们应当返回 0if (m == 0) {return 0;}int n = haystack.length();if (n < m) {return -1;}int i = 0;int j = 0;while (i < n - m + 1) {// 找到首字母相等while (i < n && haystack.charAt(i) != needle.charAt(j)) {i++;}if (i == n) {// 没有首字母相等的return -1;}// 遍历后续字符,判断是否相等i++;j++;while (i < n && j < m && haystack.charAt(i) == needle.charAt(j)) {i++;j++;}if (j == m) {// 找到return i - j;} else {// 未找到i -= j - 1;j = 0;}}return -1;}
}

写法二:KMP算法

  1. 求next数组:

    1. 初始化
    2. 前后缀不相同
    3. 前后缀相同
    4. next更新
  2. 匹配失败时,跳转到模式串中前一个字符下标所对应的next数组值,再进行判断。

注意:KMP算法主要依赖于已经匹配过的后缀,是否有前缀与其相等,若存在则可以跳过前缀进行后面的匹配,以减少匹配的次数。同时对

于模式串中的next数组的求解中,在字符不相同的时候同样依赖前后缀匹配进行优化。

class Solution {//前缀表public int strStr(String haystack, String needle) {if (needle.length() == 0) return 0;int[] next = new int[needle.length()];getNext(next, needle);int j = 0;for (int i = 0; i < haystack.length(); i++) {while (j > 0 && needle.charAt(j) != haystack.charAt(i)) j = next[j - 1];if (needle.charAt(j) == haystack.charAt(i)) j++;if (j == needle.length()) return i - needle.length() + 1;}return -1;}//求解next数组public void getNext(int[] next, String s){int j = 0;next[0] = 0;for (int i = 1 ; i < s.length() ; i++){while (j > 0 && s.charAt(i) != s.charAt(j)){j = next[j - 1];//为什么呢}if (s.charAt(j) == s.charAt(i)){j++;}next[i] = j;}}}

代码随想录算法训练营第八天相关推荐

  1. 代码随想录算法训练营第八天|kmp算法

    kmp题目链接 讲解直接看代码随想录就可以了,代码随想录 一.什么是前缀表         前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配. 那么什么是前 ...

  2. 代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符

    一.344.反转字符串 力扣 思路:很简单的一个for循环双指针,left和right交换. class Solution {public void reverseString(char[] s) { ...

  3. 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

    一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...

  4. 代码随想录算法训练营day1

    代码随想录算法训练营第一天| 704. 二分查找.27. 移除元素. 704.二分查找 题目链接:leetcode704 Binary search 暴力解法: class Solution {pub ...

  5. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  6. 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。

    代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II. 977.有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II 977.有序数组的 ...

  7. 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...

  8. 代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II 一. LeetCode977.有序数组的平方 1. 题目链接[LeetCode9 ...

  9. _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

    _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机.122.买卖股票的最佳时机II 题目列表 121.买卖股票的最佳时机 122.买卖股票的最佳时机II 1 ...

最新文章

  1. 2021年春季学期-信号与系统-第六次作业参考答案-第一小题
  2. Delphi Form Designer (窗体设计器)之二
  3. os.urandom(n)函数解释Python
  4. java求最大值_java-求一组整数中的最大值
  5. Spring5-IOC底层原理
  6. 克隆虚拟机后需要修改的注意项
  7. for循环 php 增加数组维数_PHP数组在循环中创建多维数组
  8. php如何将页面嵌入在另一盒子里,如何将一个盒子在显示在浏览器的正中间_html/css_WEB-ITnose...
  9. 使用python获取CPU和内存信息的思路与实现(linux系统)
  10. JavaScript中带有示例的Math.round()方法
  11. 【Servlet】JSP与Servlet的关系
  12. linux创建用户已存在哪里,解决linux下创建用户时出现 Creating mailbox file: 文件已存在...
  13. AAAI 2019 使用循环条件注意力结构探索回答立场检测任务
  14. 教你电脑系统如何深度清理c盘空间
  15. 23.方法重写的本质与虚方法表的使用
  16. 安卓手机管理_安卓手机会越用越卡?关闭这几个功能,还可以用三年
  17. TypesScript + Nodejs + Express + Mongoose 实现 RESTful API 实战视频教程(33 个视频)
  18. spark.yarn.jars的配置
  19. Linux下的Chm文件阅读器
  20. ecs共享型s6怎么样?

热门文章

  1. 解读VO、DTO、BO、PO、DO、DTO
  2. Build in Windows Mobile
  3. 格雷希尔GripSeal气动快速接头的密封原理
  4. PLC实训 — 气动技术认识
  5. Code::Blocks 介绍
  6. 共同助力中国实现更强大的工业机器人-斯巴拓
  7. POI excel 单元个的内容 自适应行高
  8. 9个优秀的资源网站,资源丰富到不敢想象
  9. 计算机电池的性能参数,基于51单片机的蓄电池性能测试仪的设计.doc
  10. 计算机数据分析试题,计算机二级考试真题-Excel-小马-公务员考试成绩数据分析...