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

相关推荐
github_czy1 分钟前
RRF (Reciprocal Rank Fusion) 排序算法详解
算法·排序算法
许愿与你永世安宁36 分钟前
力扣343 整数拆分
数据结构·算法·leetcode
爱coding的橙子38 分钟前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展
满分观察网友z1 小时前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
YuTaoShao2 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx2 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
大熊背2 小时前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
满分观察网友z2 小时前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
杰克尼3 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode
YuTaoShao4 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展