zoukankan      html  css  js  c++  java
  • JS leetcode 实现strStr()函数 题解分析

    壹 ❀ 引

    前几天心情比较浮躁,烦心事太多,偷懒了3天,还是继续刷leetcode。那么今天做的题目为实现 strStr() 函数。,原题如下:

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

    示例 1:

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

    示例 2:

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

    说明:

    当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

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

    那么先记录我的实现思路,再看比较优秀的实现。

    贰 ❀ 我的思路

    其实通过审题不难发现,所谓strStrr()方法其实与JavaScript的indexOf()方法相同,所以单从实现角度来说,我们首选indexOf:

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

    当然,站在JavaScript开发者角度,我们其实可以把这道题变相理解成手动实现一个indeOf()方法,这样更具挑战性一点。

    那么对于我来说,我首先想到的是使用正则,这里就直接贴代码了:

    /**
     * @param {string} haystack
     * @param {string} needle
     * @return {number}
     */
    var strStr = function(haystack, needle) {
        var regex = new RegExp(needle, 'g');
        var matchResult = regex.exec(haystack);
        return matchResult ? matchResult['index'] : -1;
    };
    

    其实很简单,needle字段作为正则匹配规则,如果匹配成功,exec方法可以直接拿到匹配字段的index;如果匹配失败结果为null,所以最后判断结果是不是null即可。

    实现后我还在想能不能站在遍历的角度来解决这个问题,先说说我的傻吊思路,虽然最后实现失败了...

    由于是从haystack中找有没有一段是needle,如果匹配成功,那么needle的第一个字符一定得出现在haystack的某哥位置,要是这点都无法满足,肯定是返回-1了。

    所以我的想法是先找needle的第一个字母出现在haystack字符的位置startIndex,记下来,如果成功找到,则遍历needle,让haystack的字符从startIndex开始依次比较,只要一个不满足同样返回-1,反之返回最初记录的startIndex。

    大家不太明白也没关系,最后我挂在strStr('mississippi', 'issip')这个例子上了,原因是mississippi的第一个i欺骗了我的实现,结果比较到issis时认为与issip不匹配,返回了-1,事实上第二个i开始的这一段是符合条件的,所以我的程序跪在这了。

    叁 ❀ 眼前一亮的做法

    这里先上代码,代码来源为用户rhinoc所答。

    /**
     * @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]) {
                if (haystack.substring(i, i + needle.length) === needle) {
                    return i;
                };
            };
        };
        return -1
    };
    

    其实只是眼睛扫一眼,就已经知道了解答思路,遍历haystack,看有没有某个字符与needle第一个字符相同,如果相同,则使用substring(start, stop)方法截取与needle相同长度的字符进行比较,看到这里我真的是眼前一亮!

    比如我挂掉的例子,即便第一个i后面的字符不相同,haystack遍历过程中也会以此比较每个i,所以看到这个答案我真是自愧不如....

    而关于substring方法表示提取从下标start开始到下标stop之间的字符,需要注意的是提取过程含头不含尾,不会包含stop下标的字符,因此最终提取字符长度为stop-start。

    好了,关于这道题就说到这了。

  • 相关阅读:
    更换glibc版本进行调试
    HDCTF 2020 Writeup
    Srop 原理与利用方法
    form使用DELETE被转换为GET的原因
    sqlite将时间转换为本地时间读取
    firewall-cmd命令
    windows创建系统服务命令
    Open_vSwitch操作
    Dublin Core
    CWM(Common warehouse metamodel)
  • 原文地址:https://www.cnblogs.com/echolun/p/12927202.html
Copyright © 2011-2022 走看看