Leetcode面试经典150题-28.找出字符串第一个匹配项的下标

2024-08-29 15:04

本文主要是介绍Leetcode面试经典150题-28.找出字符串第一个匹配项的下标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 解法都在代码里,不懂就留言或者私信,比第一题稍微难点

用KMP解这个题简直就像大炮打蚂蚁,但是没办法,现在都是这么卷

package dataStructure.bigFactory;public class _28Strstr {public static int strStr(String s1, String s2) {/**健壮性判断*/if(s1 == null || s2 == null) {return -1;}/**你比我还大,我怎么可能在内部找到你*/if(s2.length() > s1.length()) {return -1;}/**都转成字符数组*/char[] sArr1 = s1.toCharArray();char[] sArr2 = s2.toCharArray();/**获取s2的next数组,整个kmp的核心*/int[] next = generateNextArr(sArr2);/**pos1和pos2分别代表s1和s2正在匹配的位置*/int pos1 = 0;int pos2 = 0;/**下面开始匹配的过程*/while(pos1 < sArr1.length && pos2 < sArr2.length) {if(sArr1[pos1] == sArr2[pos2]) {pos1 ++;pos2 ++;} else if(next[pos2] != -1) {/**如果还可以回跳,就回跳(不是0位置)*/pos2 = next[pos2];} else {/**不能回跳的时候,表示0~pos1区间找不到这样的开头*/pos1 ++;/**这个时候pos2肯定是0*/}}/**出循环有两种可能:1.pos1越界了 2.pos2越界了* 如果pos1越界代表死都没匹配上,返回-1,pos2越界表示匹配结束找到了可以返回对应的开始位置* 我们把现在的pos1往前sArr2.length个就是开始的位置(因为pos1当前是匹配位置的下一个)*/return pos2 == sArr2.length? pos1-sArr2.length : -1;}public static int[] generateNextArr(char[] s2) {if(s2.length == 1) {return new int[]{-1};}        
/**next数组代表最长的前缀和后缀可以匹配的长度,前缀和后缀都不包含整个字符串*/int[] next = new int[s2.length];/**这个写死,是我们的规定*/next[0] = -1;next[1] = 0;/**aabaaac*/int index = 2;//这个变量有两个含义:1.从0到index-1这个子数组前缀串和后缀串的最大匹配长度//2.计算index的next的值的时候和index-1位置比较的位置int nextPosOfPrevious = 0;while(index < s2.length) {if(s2[index - 1] == s2[nextPosOfPrevious]) {next[index ++] = ++nextPosOfPrevious;} else if(next[nextPosOfPrevious] >= 0) {nextPosOfPrevious = next[nextPosOfPrevious];} else {next[index ++] = 0;}}return next;}public static void main(String[] args) {String s1 = "aabcca";String s2 = "abc";System.out.println(strStr(s1,s2));}
}

运行结果

289b7857d16a4295bbe5921e2ffa4860.jpg

最近确实没时间查到底是字节第几高的题了,稍后补充吧

也许KMP这个大家没太懂,过几天有空了我专门写一下KMP的文章解释一下,到时候还以这个为例子

这篇关于Leetcode面试经典150题-28.找出字符串第一个匹配项的下标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118195

相关文章

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -