初级算法练习第四节

119 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情

1. 引言

接下来继续下一题开展对应leetcode 习题课中初级算法题目的练习,这个就当我的学习笔记了,大家一起交流,让我们一起学习变得更好吧! 官网地址:leetcode.cn/leetbook/re…

2. 题型

  1. 实现 strStr()

实现 strStr() 函数。

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。

说明:

当 needle 是空字符串时,我们应当返回什么值呢?

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

示例 1:

输入:haystack = "hello", needle = "ll"
输出:2

示例 2:

输入:haystack = "aaaaa", needle = "bba"
输出:-1

提示:

1 <= haystack.length, needle.length <= 104
haystack 和 needle 仅由小写英文字符组成

思路:

时间复杂度为O(m x n);空间复杂度为O(1) 首先既然是思考题,排除使用indexOf,find,findIndex这些JavaScript内置已有可解题的“工具”。 我们可以采用一种暴力解法,通过获取目标字符串haystack,检测字符串needle的长度通过使用双层循环:第一层作为获取匹配目标字符串的起始序号记录,循环最大值为循环次数i加上needle的长度不高于haystack的长度,否则循环结束,这样保证入参haystack 的长度永远大于needle 检测长度,定义一个Flag,默认值为true,作为记录当无发生异动时说明已经匹配到检测对象,抛出该对应序号i;第二层作为鉴别字符串匹配的作用,循环次数只j小于needle 的长度,当自增长的haystack[i+j]没有匹配上needle[j]说明当前检测字符不匹配则跳出内层循环,i增长,接着判断haystack 的下一个字符,如果都没有匹配上则返回默认值-1。 解答:

const haystackLength = haystack.length;
    const needleLength = needle.length;
    for(let i = 0;i + needleLength <= haystackLength;i++){
        let flag = true;
        for(let j = 0;j < needleLength;j++){
            if(haystack[i + j] != needle[j]){
                flag = false;
                break;
            }

        }
        if(flag){
            return i 
        } 
    }
    return -1