文章目录

  • 前言
  • 一、题目描述
  • 二、思路
    • 1.朴素匹配
    • 1.1Java直接实现
    • 2.kmp模式匹配
  • 总结

前言

本系列文章为leetCode刷题笔记,仅供参考。

一、题目描述

若字符串 a 包含字符串 b,返回 b 在 a 中的起始下标,否则返回 -1。a,b 均不为空。

二、思路

1.朴素匹配

对字符串a遍历,依次判断是否存在字串b,时间复杂度为O(n*m),空间复杂度为O(1)。()
      代码如下:

class Solution {public int findSubString(String a,String b)//找字串b在a中的起始下标{for(int i=0;i<=a.length()-b.length();i++)//结束条件并非为a.length(){int j;for(j=0;j<b.length();j++){if(a.charAt(i+j)!=b.charAt(j))break;}if(j==b.length())return i;}return -1;}
}

1.1Java直接实现

采用String的IndexOf函数来实现:

class Solution {public int findSubString(String a,String b)//找字串b在a中的起始下标{return a.indexOf(b);}
}

2.kmp模式匹配

kmp 模式匹配的最大特点是字符串 a 的下标不会回溯。在字符串 b 和 a 的匹配过程中,如果发现 a[i] != b[j] 时,不会像朴素匹配那样,后退 i,而是根据当前已有的匹配结果(字符串 “a[i-j]…a[i-1]” 和 字符串 “b[0]…b[j-1]” 是一样的),采用 b[j’] 继续和 a[i] 继续进行匹配…

所以最主要的目标是如何来求 j’ ? 即求字符串 b 所对应的 next 数组,此数组包含了若匹配失败时,某个下标应跳转到的另一个新下标值。

1,如果 b[0] 和 a 中某个元素匹配失败,此时应该需要让 i 加一,让 b[0] 和 a 中的下一个元素进行匹配… 这种情况下:令 next[0]=-1。

2,定义:仅有 next[0] 的值能为-1,其余有些应为 -1 的值全置为 0,便于后面算法的实现。(因此这个算法并不完善:当 b 为 “ab” 时:next 数组为 [-1,0],这里没错;当 b 为 ”aa" 时:next 数组应为 [-1,-1],但实际的 next 数组为 [-1,0],多了一个无用的比较。)因此在这种情况下 next[1] 总是为 0。

3,当 b[j] != a[i] 时,即想求 next[j] 的值时,需要先判断(且令 k=next[j-1]):如果 b[k] == b[j-1],应该让 b[k+1] 和 a[i] 继续比较,故令 next[j] = k+1。 如果 b[k] != b[j-1],继续迭代判断 b[next[k]] 是否和 b[j-1] 相等…
      求 next 数组的算法可参考如下示例:

public static int[] getNext(String b){int len=b.length();int[] next=new int[len];next[0]=-1;int j,tmp;for(j=1;j<len;j++){tmp=next[j-1];if(tmp==-1||b.charAt(j-1)==b.charAt(tmp))next[j]=tmp+1;else{while(tmp!=-1&&b.charAt(j-1)!=b.charAt(tmp))tmp=next[tmp];next[j]=tmp+1;}}return next;}

kmp 模式匹配算法可参考如下代码:

    public static int kmp(String a, String b){//a,b均不为空int lenA=a.length(),lenB=b.length();int[] next=getNext(b);int i,j;for(i=0;i<=lenA-lenB;i++){for(j=0;j<lenB;){if(a.charAt(i)==b.charAt(j)){i++;j++;}else{j=next[j];if(j==-1)break;}}if(j==lenB)return i-lenB;}return -1;}

总结

LeetCode算法题2:求字符串b在字符串a中的起始下标相关推荐

  1. LeetCode算法题3:求最大子序列和

    文章目录 前言 一.递归 二.求最大子序列和 1,最朴素的解法 2,较朴素的解法(更进一步) 3,分治和递归 4,精妙的解法 总结 前言 本文简单介绍递归的使用(依次打印出一个 int 整数的每一位) ...

  2. leetcode算法题--最多的不重叠子字符串★★

    原题链接:https://leetcode-cn.com/problems/maximum-number-of-non-overlapping-substrings/ 贪心算法: 找出26个字符为首尾 ...

  3. LeetCode算法题12:递归和回溯-字符串中的回溯问题

    文章目录 一.电话号码的字母组合 回溯 : 二.括号生成 回溯 : 总结 关于回溯和递归 括号生成的递归描述 : 电话号码的字母组合的递归描述 : 括号生成的BFS描述 : 一.电话号码的字母组合 题 ...

  4. 【Day24】 LeetCode算法题 (注释详细+解题思路)[43. 字符串相乘 ] [1800. 最大升序子数组和]

    刷题打卡,第 二十四 天 题目一.43. 字符串相乘 题目二.1800. 最大升序子数组和 题目一.43. 字符串相乘 原题链接:43. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 n ...

  5. Leetcode算法题(C语言)15--字符串中的第一个唯一字符

    题目:字符串中的第一个唯一字符 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = & ...

  6. Leetcode算法题:两个有序数组求中位数

    Leetcode算法题:两个有序数组求中位数 要求时间复杂度为O(log(m+n)) 思路: 暴力解决:合并数组并排序,简单且一定能实现,时间复杂度O(m+n) 由于两个数组已经排好序,可一边排序一边 ...

  7. LeetCode算法题整理(200题左右)

    目录 前言 一.树(17) 1.1.后序遍历 1.2.层次遍历 1.3.中序 1.4.前序 二.回溯(20) 2.1.普通回溯 2.2.线性回溯:组合.排列.子集.分割 2.3.矩阵回溯 三.二分查找 ...

  8. LeetCode算法题-Nth Digit(Java实现)

    这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...

  9. LeetCode算法题-Convert a Number to Hexadecimal(Java实现)

    这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...

最新文章

  1. 2018-3-25论文(Grey Wolf Optimizer )以及(The Whale Optimizer Algorithm)笔记一 -----作者网站+两论文摘要比对比
  2. PMP-【第1章 引论】-2020-12-07(18页-24页)
  3. 怎么让员工服从管理_面对员工抬杠,情绪负面,管理者,你该怎么管
  4. OpenCV离散傅立叶变换
  5. uwsgi+python+flask+nginx服务器部署
  6. Hadoop之HDFS常用Shell命令
  7. lynda ux_举办UX午餐并学习并成为UX英雄
  8. 『真实故事』我经历了坏人变老了
  9. linux chown 命令
  10. openai-gpt_GPT-3是“人类”吗?
  11. el-input只能输入数值和小数点,并且不显示上下箭头
  12. 计算机科技公司的设备签收单,【验收单格式】_设备验收单格式与范本
  13. handsome主题魔改
  14. 从单张图重建三维人体模型综述(一)
  15. java添加java_home环境变量_如何正确设置jdk环境变量JAVA_HOME?
  16. 在分析仪中创建用户自定义的TRL校准件【以RS矢量网络分析仪为例】
  17. rabbit的安装配置过程
  18. Abbirb120型工业机器人_工控产品-ABB IRB120工业机器人-IRB120
  19. H5页面在iOS11系统上白屏了,bug修复过程
  20. iOS开发-iOS10新特性及开发者主要注意点

热门文章

  1. 类 property属性
  2. Codeforces Round #555 (Div. 3) AB
  3. ROS学习笔记九:ROS工具
  4. OpenCV-自定义harris检测
  5. SIGTERM等信号含义【转】
  6. jquery 只能输入汉字
  7. 一个方框,文字在边框上
  8. python主要数据变量及其类型说明_Python的数据类型和变量
  9. hdu5108枚举因子求最小的m
  10. 【计算机网络】应用层 : DNS 域名解析系统 ( 域名 | 域名服务器 | 域名解析过程 | 递归查询 | 迭代查询 | 高速缓存 )