力扣面试经典算法150题:找出字符串中第一个匹配项的下标

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

今天的题目是力扣面试经典150题中的数组的简单题: 找出字符串中第一个匹配项的下标

题目链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/?envType=study-plan-v2&envId=top-interview-150

题目描述

给定一个字符串 haystack 和一个字符串 needle,请找出 needle 在 haystack 中第一次出现的位置(下标)。如果 needle 不是 haystack 的一部分,则返回 -1。

  • 示例:
    • 输入:
      haystack = “hello”, needle = “ll”
    • 输出:
      2
    • 输入:
      haystack = “aaaaa”, needle = “bba”
    • 输出:
      -1

题目分析

题目要求我们在一个字符串 haystack 中找到另一个字符串 needle 第一次出现的位置。如果 needle 不是 haystack 的一部分,则返回 -1。

很明显,字符串needle是被包含在haystack中的一个子串,这意味着needle的字符在haystack中连续出现。

只需要第一次出现的位置则意味着我们需要的结果是needle中的字符第一次在haystack中连续出现时的第一个字符在haystack中的下标。

解题思路

分隔法

第一时间想到的办法:

  1. 判断haystack是否包含needle,不包含直接返回-1。
  2. 判断haystack是否以needle开头, 是的话返回0。
  3. 使用needle分割haystack,获取第一段的字符串长度返回即可。

整串匹配法

在分割法之后再思考想到的办法,使用整个子串去匹配:

  1. 获取两个字符串的长度。
  2. 以两者差值作为循环条件进行循环。
  3. 截取当前下标开始到子串长度的字符串与子串对比,一致则返回下标的值。
  4. 返回-1。

单字符匹配法:

在整串匹配法后想到的,不截取字符串,直接依次比较每个字符:

  1. 获取两个字符串的长度。
  2. 以两者差值作为循环条件进行循环
  3. 从 haystack 的第一个字符开始,逐个字符比较。
  4. 如果发现 haystack 中有一段子串与 needle 相同,则返回这段子串的起始位置。
  5. 如果遍历完整个 haystack 都没有找到匹配的子串,则返回 -1。

KMP 算法:

在上诉方法用完以后,尝试找到该类型题目的特殊算法:

  1. 构建 KMP 的 next 数组,然后根据 next 数组进行快速匹配。
  2. 如果找到匹配的子串,则返回起始位置;否则,返回 -1。

有点抽象,没完全想明白,这里就不贴了。。。

实际算法代码
下面是使用直接搜索法的 Java 实现:

public static void main(String[] args) {StrStr solution = new StrStr();// 示例数据String haystack = "hello";String needle = "ll";// 调用计算第一个匹配项下标的方法int index1 = solution.strStr1(haystack, needle);int index2 = solution.strStr2(haystack, needle);int index3 = solution.strStr3(haystack, needle);// 输出结果System.out.println("The index1 of the first occurrence is: " + index1);System.out.println("The index2 of the first occurrence is: " + index2);System.out.println("The index3 of the first occurrence is: " + index3);}/*** 查找字符串中第一个匹配项的下标: 分割法** @param haystack 主字符串* @param needle   子字符串* @return 第一个匹配项的下标*/public int strStr1(String haystack, String needle) {if (needle.isEmpty()) {return 0;}if (!haystack.contains(needle)) {return -1;}if (haystack.startsWith(needle)) {return 0;}String[] split = haystack.split(needle);if (split.length > 0) {return split[0].length();}return -1;}/*** 查找字符串中第一个匹配项的下标:整串匹配法** @param haystack 主字符串* @param needle   子字符串* @return 第一个匹配项的下标*/public int strStr2(String haystack, String needle) {if (needle.isEmpty()) {return 0;}int n = haystack.length();int m = needle.length();for (int i = 0; i <= n - m; i++) {if (needle.equals(haystack.substring(i, i + m))) {return i;}}return -1;}/*** 查找字符串中第一个匹配项的下标:单字符匹配法** @param haystack 主字符串* @param needle   子字符串* @return 第一个匹配项的下标*/public int strStr3(String haystack, String needle) {if (needle.isEmpty()) {return 0;}int n = haystack.length();int m = needle.length();for (int i = 0; i <= n - m; i++) {boolean found = true;for (int j = 0; j < m; j++) {if (haystack.charAt(i + j) != needle.charAt(j)) {found = false;break;}}if (found) {return i;}}return -1;}

结果

同时调用三个方法,返回结果都符合预期:

在这里插入图片描述

我们分别提交到力扣:

在这里插入图片描述
通过肯定都是通过的,这里贴第三种方法的图,因为这个方法的相对最优。

以下是三种方法的提交结果:

  1. 分割法

在这里插入图片描述

  1. 整串匹配法

在这里插入图片描述

  1. 单字符匹配法

    在这里插入图片描述

三种方法最先能想到的容易程度以及理解难度正好按与算法的效果相反,难道这就是算法吗

在这里插入图片描述

总结

今天自己想了三种方法,特殊算法KMP有点抽象一下子还没想明白,有兴趣的自行学习,明天我再抽空理解一下。

另外数组简单难度的题目已经做完,下面开始上强度了。。。

加油!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短视频SDK解决方案,降低行业开发门槛

美摄科技匠心打造了一款集前沿技术与极致体验于一体的短视频SDK解决方案&#xff0c;它不仅重新定义了短视频创作的边界&#xff0c;更以行业标杆级的短视频特效&#xff0c;让每一帧画面都闪耀不凡光芒。 【技术赋能&#xff0c;创意无限】 美摄科技的短视频SDK&#xff0c;…

基于DVWA-Brute Force(LowMedium)的渗透测试

Brute force主要是通过爆破达到渗透目的&#xff1a; Low 查看源代码&#xff1a; <?phpif( isset( $_GET[ Login ] ) ) {// Get username$user $_GET[ username ];// Get password$pass $_GET[ password ];$pass md5( $pass );// Check the database$query "SE…

遗传算法与深度学习实战(4)——遗传算法详解与实现

遗传算法与深度学习实战&#xff08;4&#xff09;——遗传算法详解与实现 0. 前言1. 遗传算法简介1.1 遗传学和减数分裂1.2 类比达尔文进化论 2. 遗传算法的基本流程2.1 创建初始种群2.2 计算适应度2.3 选择、交叉和变异2.4算法终止条件 3. 使用 Python 实现遗传算法3.1 构建种…

Adobe Audition AU 2023-23.6.6.1 解锁版下载和安装教程(专业的音频处理工具)

前言 Audition是Adobe旗下一款非常好用的音频处理工具&#xff0c;软件为用户们提供了功能强大的音频编辑功能和一个相对完善的工作流程&#xff0c;用户们无论是录制音乐、无线电广播还是视频配音&#xff0c;多音频合成&#xff0c;这款软件都能够给你足够的创作动力。audit…

7za解压缩工具

1、unzip无法解压缩大于4G的文件 从Windows平台通过MobaXterm上传一个大小约为5G的zip文件到AutoDL Linux系统上&#xff0c;使用unzip解压过程中出现如下错误&#xff1a; 从网上搜索了一下相关资料&#xff0c;发现是当前的unzip版本不支持4G以上的压缩包。要么升级到最新…

贪吃蛇(C语言详解)

贪吃蛇游戏运行画面-CSDN直播 目录 贪吃蛇游戏运行画面-CSDN直播 1. 实验目标 2. Win32 API介绍 2.1 Win32 API 2.2 控制台程序&#xff08;Console&#xff09; 2.3 控制台屏幕上的坐标COORD 2.4 GetStdHandle 2.5 GetConsoleCursorlnfo 2.5.1 CONSOLE_CURSOR_INFO …

60万奖池,CV算法+大模型创新应用双赛道——2024无锡国际人工智能创新应用大赛正式启动!

2024无锡国际人工智能创新应用大赛于8月15日开赛&#xff0c;本次大赛开放计算机视觉算法和大模型创新应用双赛道&#xff0c;召唤全球开发者、创新团队和企业实现人工智能技术创新与应用。 聚焦前沿&#xff0c;双重赛道 算法赛道参赛者将使用Jittor框架进行无人机视角下的算…

Wireshark显示过滤器常用关键字及过滤表达式

Wireshark显示过滤器常用关键字及过滤表达式 1. 过滤器类型 Wireshark抓包工具提供了两种类型过滤器&#xff1a;抓包过滤器 和 显示过滤器。 抓包过滤器&#xff1a; 抓取满足过滤条件的数据包&#xff0c;不满足过滤条件的数据包不会被抓取。 显示过滤器&#xff1a; 包已…

软件测试面试必杀篇:【2024软件测试面试八股文宝典】

800道软件测试面试真题&#xff0c;高清打印版打包带走&#xff0c;横扫软件测试面试高频问题&#xff0c;涵盖测试理论、Linux、MySQL、Web测试、接口测试、App测试、Python、Selenium、性能测试、LordRunner、计算机网络、数据结构与算法、逻辑思维、人力资源等模块面试题&am…

【计算机网络】TCP实战

其实有了UDP的基础&#xff0c;TCP不管怎么说学习起来都还是比较舒服的&#xff0c;至少是比直接就学习TCP的感觉好。 这篇文章最多就是介绍一下起手式&#xff0c;如果想带业务的话和UDP那篇是完全一样的&#xff0c;就不进行演示了。 总的来说还是很简单的。 目录 Echo服务端…

食品零食小吃商城管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…

科技云报道:“大模型+机器人”,具身智能将开启“智械时代”

科技云报道原创。 从15世纪达芬奇绘制出世界上第一份人形机器人手稿&#xff0c;到如今波士顿动力、本田、特斯拉、Figure AI等企业相继推出了人形机器人产品&#xff0c;机器人新物种持续衍生&#xff0c;人形机器人产业已经从萌芽概念阶段进入产业化落地前期。 近日&#x…

OriginPro快速上手指南:数据可视化与分析的利器

目录 OriginLab - Origin and OriginPro - Data Analysis and Graphing Softwarehttps://www.originlab.com/​编辑 一、安装与界面概览 安装 界面概览 二、基础操作 数据输入 创建图表 三、高级功能 数据分析 自动化与脚本 Origin 提供了几个小工具 四、技巧与提示…

硬件模拟的基本原理是什么?

具体来说&#xff0c;这种设计方法减少了集成电路 (IC) 设计和开发的设计迭代次数&#xff0c;并且广泛适用于所有电力电子设计。我详细介绍了我在快速上市 IC 开发方面的经验&#xff0c;并将该方法与其他旨在缩短产品开发时间的技术进行了对比。 产品开发流程 图 1&#xff…

​线上教育_VR虚拟实验室​解决方案优缺点

线上教育的兴起也预示着对VR虚拟实验室的需求&#xff0c;这些虚拟实验室可以帮助学生学习他们研究的经验和进行实践&#xff0c;帮助学生更好地理解知识。但是&#xff0c;基于VR虚拟现实技术的虚拟实验室本质上是灵活的&#xff0c;它能让孩子们更轻松、更快速地探索各种新事…

快讯 | 苹果拟于2026年推出1000美元桌面机器人,集成Siri智能技术

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

物流快递外卖管理平台系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…

使用循环在el-select下拉框中循环出-3至50

问: 使用循环在el-select下拉框中循环出-3至50 回答: <el-form-itemprop"adPosition"label"广告位置":rules"{required: true, message: 广告位置不能为空, trigger: change}" ><el-select v-model"addDataForm.adPosition"…

AI芯片:高性能卷积计算中的数据复用

随着深度学习的飞速发展&#xff0c;对处理器的性能要求也变得越来越高&#xff0c;随之涌现出了很多针对神经网络加速设计的AI芯片。卷积计算是神经网络中最重要的一类计算&#xff0c;本文分析了高性能卷积计算中的数据复用&#xff0c;这是AI芯片设计中需要优化的重点之一&a…

2024医疗器械网络交易服务第三方平台备案申请流程

前几天&#xff0c;小编给大家分享了药品网络交易第三方平台备案申请流程&#xff0c;好多客户就来问&#xff0c;那医疗器械网络交易服务第三方平台备案怎么办理呢&#xff1f; 今天&#xff0c;就给大家好好聊聊医疗器械网络交易服务第三方平台备案申请流程&#xff0c;供大…