LeetCode算法题2:求字符串b在字符串a中的起始下标
文章目录
- 前言
- 一、题目描述
- 二、思路
- 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中的起始下标相关推荐
- LeetCode算法题3:求最大子序列和
文章目录 前言 一.递归 二.求最大子序列和 1,最朴素的解法 2,较朴素的解法(更进一步) 3,分治和递归 4,精妙的解法 总结 前言 本文简单介绍递归的使用(依次打印出一个 int 整数的每一位) ...
- leetcode算法题--最多的不重叠子字符串★★
原题链接:https://leetcode-cn.com/problems/maximum-number-of-non-overlapping-substrings/ 贪心算法: 找出26个字符为首尾 ...
- LeetCode算法题12:递归和回溯-字符串中的回溯问题
文章目录 一.电话号码的字母组合 回溯 : 二.括号生成 回溯 : 总结 关于回溯和递归 括号生成的递归描述 : 电话号码的字母组合的递归描述 : 括号生成的BFS描述 : 一.电话号码的字母组合 题 ...
- 【Day24】 LeetCode算法题 (注释详细+解题思路)[43. 字符串相乘 ] [1800. 最大升序子数组和]
刷题打卡,第 二十四 天 题目一.43. 字符串相乘 题目二.1800. 最大升序子数组和 题目一.43. 字符串相乘 原题链接:43. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 n ...
- Leetcode算法题(C语言)15--字符串中的第一个唯一字符
题目:字符串中的第一个唯一字符 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = & ...
- Leetcode算法题:两个有序数组求中位数
Leetcode算法题:两个有序数组求中位数 要求时间复杂度为O(log(m+n)) 思路: 暴力解决:合并数组并排序,简单且一定能实现,时间复杂度O(m+n) 由于两个数组已经排好序,可一边排序一边 ...
- LeetCode算法题整理(200题左右)
目录 前言 一.树(17) 1.1.后序遍历 1.2.层次遍历 1.3.中序 1.4.前序 二.回溯(20) 2.1.普通回溯 2.2.线性回溯:组合.排列.子集.分割 2.3.矩阵回溯 三.二分查找 ...
- LeetCode算法题-Nth Digit(Java实现)
这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...
- LeetCode算法题-Convert a Number to Hexadecimal(Java实现)
这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...
最新文章
- 2018-3-25论文(Grey Wolf Optimizer )以及(The Whale Optimizer Algorithm)笔记一 -----作者网站+两论文摘要比对比
- PMP-【第1章 引论】-2020-12-07(18页-24页)
- 怎么让员工服从管理_面对员工抬杠,情绪负面,管理者,你该怎么管
- OpenCV离散傅立叶变换
- uwsgi+python+flask+nginx服务器部署
- Hadoop之HDFS常用Shell命令
- lynda ux_举办UX午餐并学习并成为UX英雄
- 『真实故事』我经历了坏人变老了
- linux chown 命令
- openai-gpt_GPT-3是“人类”吗?
- el-input只能输入数值和小数点,并且不显示上下箭头
- 计算机科技公司的设备签收单,【验收单格式】_设备验收单格式与范本
- handsome主题魔改
- 从单张图重建三维人体模型综述(一)
- java添加java_home环境变量_如何正确设置jdk环境变量JAVA_HOME?
- 在分析仪中创建用户自定义的TRL校准件【以RS矢量网络分析仪为例】
- rabbit的安装配置过程
- Abbirb120型工业机器人_工控产品-ABB IRB120工业机器人-IRB120
- H5页面在iOS11系统上白屏了,bug修复过程
- iOS开发-iOS10新特性及开发者主要注意点
热门文章
- 类 property属性
- Codeforces Round #555 (Div. 3) AB
- ROS学习笔记九:ROS工具
- OpenCV-自定义harris检测
- SIGTERM等信号含义【转】
- jquery 只能输入汉字
- 一个方框,文字在边框上
- python主要数据变量及其类型说明_Python的数据类型和变量
- hdu5108枚举因子求最小的m
- 【计算机网络】应用层 : DNS 域名解析系统 ( 域名 | 域名服务器 | 域名解析过程 | 递归查询 | 迭代查询 | 高速缓存 )