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 很短,这段代码可能会更快地返回结果。

相关推荐
LNTON羚通1 小时前
摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现
算法·目标检测·音视频·监控·视频监控
哭泣的眼泪4082 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
清炒孔心菜2 小时前
每日一题 LCR 078. 合并 K 个升序链表
leetcode
Microsoft Word3 小时前
c++基础语法
开发语言·c++·算法
天才在此3 小时前
汽车加油行驶问题-动态规划算法(已在洛谷AC)
算法·动态规划
莫叫石榴姐4 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
茶猫_5 小时前
力扣面试题 - 25 二进制数转字符串
c语言·算法·leetcode·职场和发展
肥猪猪爸7 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
readmancynn7 小时前
二分基本实现
数据结构·算法
萝卜兽编程7 小时前
优先级队列
c++·算法