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

embedded/2024/10/18 3:27:23/

题目描述

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:“sad” 在下标 06 处匹配。第一个匹配项的下标是 0 ,所以返回 0

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1

解题

最简单的解法,但是面试的时候面试官可能会不让用这种方法
直接利用JavaScript自带的indexOf实现

/*** @param {string} haystack* @param {string} needle* @return {number}*/
var strStr = function(haystack, needle) {return haystack.indexOf(needle)
};

第二种解法
双层for循环嵌套,当首位匹配时,循环检查后几位是否相同。

/*** @param {string} haystack* @param {string} needle* @return {number}*/
var strStr = function(haystack, needle){if (needle==="") return 0for(var i=0;i<haystack.length;i++){if(haystack[i]===needle[0]){var flag = true;for (var j=1;j<needle.length;j++){if (haystack[i+j]!=needle[j]){flag = falsebreak;}}if (flag) return i}}return -1
};

下面是这段代码的逻辑分析:

  1. 首先,函数 strStr 接收两个参数:haystackneedle

  2. 如果 needle 是一个空字符串,根据题意,应该返回 0,因为空字符串被认为是在任何字符串的任何位置都匹配的。

  3. 接下来,函数使用一个 for 循环遍历 haystack 中的每个字符。循环变量 i0 开始,直到 haystack 的长度。

  4. 在循环内部,首先检查 haystack 中当前索引 i 处的字符是否与 needle 的第一个字符相等。如果是,那么进入下一个判断。

  5. 如果当前字符匹配,函数会尝试检查 needle 的剩余部分是否也与 haystack 中从当前索引 i 开始的子串匹配。这通过另一个 for 循环实现,循环变量 j1 开始,直到 needle 的长度。

  6. 在内部的 for 循环中,如果发现任何不匹配的字符,将 flag 变量设置为 false 并跳出循环。如果所有字符都匹配,flag 保持为 true

  7. 如果 flagtrue,说明找到了匹配的子串,函数返回当前索引 i

  8. 如果循环结束后没有找到匹配的子串,函数返回 -1

这段代码的效率取决于 haystackneedle 的长度。在最坏的情况下,它的时间复杂度是 O(n*m),其中 nhaystack 的长度,mneedle 的长度,因为它可能需要检查 haystack 中的每个可能的子串。然而,如果 needle 的第一个字符在 haystack 中不常见,或者 needle 很短,这段代码可能会更快地返回结果。


http://www.ppmy.cn/embedded/109544.html

相关文章

使用lspci命令获取加速卡型号

文章目录 前言一、lspci -nn 获取具体厂商及设备ID二、使用步骤三、使用3080Ti再查询一下 前言 新到的实验机器和加速卡&#xff0c;安装好之后发现lspci命令没有显示型号&#xff0c;这里记录下使用 Vendor ID和Device ID 通过网页查询获取加速卡具体型号的过程。 一、lspci …

Python--列表简介

列表是什么 列表让你能够在⼀个地方存储成组的信息&#xff0c;其中既可以只包含几个元素&#xff0c;也可以包含数百万个元素。列表是新手可直接使用的最强大的Python 功能之⼀。 列表&#xff08;list&#xff09;是一种可变的序列类型&#xff0c;用于存储一系列有序的元素…

13款常用AI编程工具

AI编程工具的选择和使用&#xff0c;主要取决于具体的项目需求、编程语言、以及AI任务的类型&#xff08;如机器学习、自然语言处理、计算机视觉等&#xff09;。下面是一些广泛使用的AI编程工具合集&#xff0c;涵盖了从开发、训练、到部署的各个环节&#xff1a; Jupyter Not…

Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制

文章目录 Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制1. 前言2. 项目环境搭建3. 项目路由机制3.1. 1&#xff09;先搜索pom.xml文件&#xff0c;看看使用了什么框架3.2. 2&#xff09;确定是否是spring的路由机制3.3. 3&#xff09;确定自写路由机制的…

网页时装购物系统:Spring Boot技术的实际应用

第2章相关技术 2.1 B/S架构 B/S结构的特点也非常多&#xff0c;例如在很多浏览器中都可以做出信号请求。并且可以适当的减轻用户的工作量&#xff0c;通过对客户端安装或者是配置少量的运行软件就能够逐步减少用户的工作量&#xff0c;这些功能的操作主要是由服务器来进行控制的…

ios 项目中设置左侧徽标

// // CategoryViewController.m // scxhgh // // Created by xmkjsoft on 2024/7/16. // #import "CategoryViewController.h" #import "SideMenuViewController.h" // 引入侧边栏控制器的头文件 #import "NavigationBarUtils.h" int…

yum源配置与静态配置地址

网络yum源 备份配置文件 下载新的CentOS-Base.repo文件到/etc/yum.repos.d/目录下 执行yum clean all清除原有 yum 缓存 执行yum makecache&#xff08;刷新缓存&#xff09; 本地yum 将/etc/yum/repos.d/下的文件a都移走&#xff0c;此处移到了该目录下的bak中 找到光盘路…

Android 结合Opencv检测画面中的圆

记下来不用找 Opencv资源https://download.csdn.net/download/qq_37324563/89729678 版本可能比较老,凑合用吧 mBinding.cameraview.setCvCameraViewListener(object : CameraBridgeViewBase.CvCameraViewListener2 {/*** 当摄像机预览开始时&#xff0c;这个方法就会被调用…