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

题目描述

给你两个字符串 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实现

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

第二种解法

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

javascript 复制代码
/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle){
    if (needle==="") return 0
    for(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 = false
                    break;
                }
            }
            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 很短,这段代码可能会更快地返回结果。

相关推荐
sali-tec5 分钟前
C# 基于OpenCv的视觉工作流-章81-弯脚检测
图像处理·人工智能·opencv·算法·计算机视觉
kkeeper~6 分钟前
0基础C语言积跬步之自定义类型联合和枚举
c语言·开发语言·算法
昵称好难啊7 分钟前
4.OpenClaw源码解析_路由的概念
人工智能·算法
wanderist.8 分钟前
14决赛蓝桥杯
职场和发展·蓝桥杯
Bingorl12 分钟前
机器学习之KNN算法
人工智能·算法·机器学习
muddjsv14 分钟前
《算法导论》入门学习路径:从零基础到系统掌握
学习·算法
曲美丽21 分钟前
技术基础理论(面试)
面试·职场和发展
KaMeidebaby31 分钟前
卡梅德生物技术快报|组蛋白乙酰化修饰调控动脉粥样硬化的分子机制及中药表观干预研究
网络·人工智能·网络协议·tcp/ip·算法
Fms_Sa31 分钟前
分治法—最大子段问题
算法·c#
Galerkin码农选手37 分钟前
awq_marlin和gptq_marlin量化算法简要介绍
算法