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

news2024/11/16 1:52:21

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

用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的文章解释一下,到时候还以这个为例子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2090048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EasyCode实现完整CRUD + 分页封装

文章目录 1.创建一个表sys-user2.EasyCode 模板配置1.entity.java.vm2.dao.java.vm3.mapper.xml.vm4.service.java.vm5.serviceImpl.java.vm6.controller.java.vm7.PageInfo.java.vm8.PageResult.java.vm9.SunPageHelper.java.vm 3.EasyCode生成CRUD1.右键表&#xff0c;选择Ge…

Linux系统查看磁盘、内存使用情况、查看当前文件夹内文件详情:free、top、df、du、ls

Liunx系统查看内存使用情况 free&#xff1a;查看当前内存以及交换区内存使用情况&#xff0c;默认显示单位是比特&#xff0c;加上参数-h以易读的方式显示&#xff08;如KB、MB、G&#xff09;&#xff0c;在Linux系统中所有查询加上-h参数均以易读的方式显示。 资源管理器查看…

【C++ Primer Plus习题】7.5

问题: 解答: #include <iostream> using namespace std;int function(int n) {if (n 0)return 1;if (n 1)return 1;return n* function(n - 1); }int main() {int value 0;while (true){cout << "请输入数字:";cin >> value;cout << val…

【读书笔记-《30天自制操作系统》-11】Day12

从本篇内容开始讲解定时器。本篇内容比较简单&#xff0c;首先介绍定时器的概念与设置方法&#xff0c;然后介绍超时的中断处理&#xff0c;并对中断处理函数进行了优化。 1. 定时器 定时器是操作系统中十分重要的功能。它的原理很简单&#xff0c;只是每隔一段时间发送一个…

接口自动化测试框架:SoapUI

SoapUI是一个非常流行的用于Web服务测试的工具。它允许你对SOAP和RESTful Web服务进行测试。在本篇文章中&#xff0c;我们将介绍SoapUI的背景、好处以及企业实际使用该工具的干货。 一、背景 在过去的几年中&#xff0c;Web服务变得越来越流行。由于不同的应用程序可以通过W…

新材料正在加速推动压铸领域3D打印技术应用

3D打印技术&#xff0c;以其独特的逐层累加粉末材料成型方式&#xff0c;正逐步解锁模具制造的无限可能&#xff0c;尤其在实现复杂几何构型与内部结构优化方面展现出非凡潜力。这一技术革新不仅提升了模具制造的精度与效率&#xff0c;还通过随形水路、随形透气钢等创新设计&a…

利润暴涨507%的携程,做对了什么?

关于旅行&#xff0c;1500年前&#xff0c;古罗马思想家圣奥古斯丁曾在《忏悔录》这样评价&#xff1a; “世界是一本书&#xff0c;而不旅行的人只读了其中的一页。” 如今&#xff0c;旅行更是承载了人们逃离工作、抛开忧虑的祈望&#xff0c;成为了理想中的“诗和远方”。…

Google play应用老包突然被暂停和删除了,什么原因?

相信不少开发者都遇到应用突然被暂停和删除的情况&#xff0c;被谷歌判为应用存在欺骗行为&#xff0c;还会在某种程度上“明确”指出应用违规的原因&#xff1a;“您的应用包含可能使用户、用户数据或设备面临风险的代码&#xff0c;以及/或您的应用未能兑现对用户的承诺。” …

治愈系风景视频素材下载网站有哪些?令人治愈美景素材库网站分享

当我们谈到视频制作时&#xff0c;风景视频素材总是能为作品带来生动的视觉效果和震撼的感官体验。无论是用于旅游宣传、自然纪录片&#xff0c;还是日常生活记录&#xff0c;优质的风景视频素材都是不可或缺的。尽管高清美丽的风景素材并不容易获取&#xff0c;特别是那些既免…

Runway删库跑路,真的run away了!

没有任何通知&#xff0c;Runway在Hugging Face上的内容全部删除了&#xff01; 目前具体原因不明。Runway的主页只留下了一句话&#xff1a; 我们不再对HuggingFace账号进行维护。 据悉&#xff0c;Runway在Hugging Face上&#xff0c;最火的、也是争议最大的项目&#xff0c;…

成为优秀自动化测试工程师的7个步骤!

成为优秀自动化测试工程师的7个步骤 自动化测试是软件开发过程中至关重要的一环&#xff0c;它可以提高测试效率、减少人工测试的错误率&#xff0c;并且可以随时重复执行以确保软件质量。成为一名优秀的自动化测试工程师需要不断学习和提升自己的技能。以下是从0到1的详细步骤…

注册免费的vps:infinityfree

首先是注册网址 https://dash.infinityfree.com/login 各位自行注册就好了 注册好后创建账户&#xff0c;选择最左边这个免费的就可以了 然后可以创建一个子域名&#xff0c;各位自行选择后缀和填写前面就好了 然后拉下来选择 I approve 然后创建账户 然后就可以打开控制面…

机器视觉--光源打光技巧

1.高角度环光与低角度环光? 这里的角度指的是与水平线之间的夹角,夹角介于0和90之间。一般夹角大于45度的是高角度光源。90度光源就是垂直往下面打光了,如图所示,这种打光的结果就是突出平面,有倒角的边缘部分可能不明显。呈现出中间亮,边缘暗; 低角度光,呈现的效果是…

css中变量

1. 定义变量 在 CSS 中&#xff0c;使用–前缀来定义变量。变量的命名可以由字母、数字、破折号和下划线组成&#xff0c;但必须以字母开头。变量的定义通常放在选择器的规则集内&#xff0c;或者在根元素&#xff08;:root&#xff09;中定义&#xff0c;以便全局使用。例如&a…

PHP智能化排队叫号系统微信小程序源码

&#x1f525;智能化排队叫号系统&#xff0c;让等待也变得优雅✨ &#x1f680;【告别冗长等待&#xff0c;拥抱智能时代】&#x1f680; 你还在为在银行、医院或政务大厅的长队而烦恼吗&#xff1f;智能化排队叫号系统&#xff0c;让这一切成为过去&#xff01;只需轻轻一扫…

第22周:调用Gensim库训练Word2Vec模型

目录 前言 一、Word2vec基本知识 1.1 Word2Vec是什么 1.2 Word2Vec两种主要模型架构 1.2.1 CBOW模型 1.2.2 Skip-gram模型 1.3 实例说明 1.4 调用方法 二、准备工作 2.1 安装Gensim库 2.2 对原始语料分词 2.2 添加自定义停用词 三、训练Word2Vec模型 四、模型应用…

XT4077 1.0A 具有 USB 接口兼容的线性电池管理芯片

产品概述 XT4077 是可以对单节可充电锂电池进行恒流/恒压充电的充电器电路元器件。该器件内部包括功率品体管&#xff0c;应用时不需要外部的电流检测电阻和阻流二极管。XT4077 只需要极少的外围元器件&#xff0c;并且符合 USB 总线技术规范&#xff0c;非常适合于便携式…

C语言模拟考试

目录 函数题求两个形参的乘积和商统计专业人数字符串指定位置插入求字符串中整数字符之和 编程题这是一道计算题买复印纸(误差)求给定数组元素的最大值统计数字字符分段函数求值逆序的三位数三天打鱼两天晒网计算天数 输出个等腰梯形吧幸运数字学生的平均成绩 找最长的字符串 函…

Vue3安装Element Plus

文章目录 安装使用包管理器安装配置&#xff1a;完整引入按需引入&#xff1a; 使用&#xff1a; 以下将参考Element Plus官网 一个 Vue 3 UI 框架 | Element Plus (element-plus.org)进行 安装 在创建好的项目文件控制台下安装&#xff1a; 使用包管理器 我们建议您使用包…

设计模式结构型模式之代理模式

结构型模式之代理模式 一、概念和使用场景1、概念2、核心思想3、java实现代理模式的方式4、使用场景 二、示例讲解1. 静态代理2. 动态代理 三、总结1、使用规则2、代理模式的优点包括&#xff1a;3、代理模式的缺点包括&#xff1a; 一、概念和使用场景 1、概念 代理模式是一…