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

相关推荐
zero_one_Machel几秒前
leetcode73矩阵置零
算法·leetcode·矩阵
青椒大仙KI1132 分钟前
24/9/19 算法笔记 kaggle BankChurn数据分类
笔记·算法·分类
^^为欢几何^^36 分钟前
lodash中_.difference如何过滤数组
javascript·数据结构·算法
豆浩宇36 分钟前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr
浅念同学1 小时前
算法.图论-并查集上
java·算法·图论
何不遗憾呢1 小时前
每日刷题(算法)
算法
立志成为coding大牛的菜鸟.1 小时前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞1 小时前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
liangbm31 小时前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
潮汐退涨月冷风霜1 小时前
机器学习之非监督学习(四)K-means 聚类算法
学习·算法·机器学习