壹 ❀ 引

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

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

示例 1:

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

示例 2:

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

说明:

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

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

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

贰 ❀ 我的思路

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

  1. /**
  2. * @param {string} haystack
  3. * @param {string} needle
  4. * @return {number}
  5. */
  6. var strStr = function(haystack, needle) {
  7. return haystack.indexOf(needle);
  8. };

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

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

  1. /**
  2. * @param {string} haystack
  3. * @param {string} needle
  4. * @return {number}
  5. */
  6. var strStr = function(haystack, needle) {
  7. var regex = new RegExp(needle, 'g');
  8. var matchResult = regex.exec(haystack);
  9. return matchResult ? matchResult['index'] : -1;
  10. };

其实很简单,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所答。

  1. /**
  2. * @param {string} haystack
  3. * @param {string} needle
  4. * @return {number}
  5. */
  6. var strStr = function (haystack, needle) {
  7. if (needle === "") {
  8. return 0;
  9. };
  10. for (var i = 0; i < haystack.length; i++) {
  11. if (haystack[i] === needle[0]) {
  12. if (haystack.substring(i, i + needle.length) === needle) {
  13. return i;
  14. };
  15. };
  16. };
  17. return -1
  18. };

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

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

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

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

JS leetcode 实现strStr()函数 题解分析的更多相关文章

  1. #leetcode刷题之路28-实现 strStr() 函数

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

  2. 【LeetCode字符串#05】基于个人理解的KMP算法图解,以及应用到strStr()函数实现

    KMP算法(用于实现 strStr()) strStr()函数是用来在一个字符串中搜索是否存在另一个字符串的函数,其匹配字符串方式为KMP算法 KMP算法基础理论 假设有如下两个字符串 文本串 aab ...

  3. Leetcode 10. 正则表达式匹配 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  4. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  5. POJ1226 Substrings ——后缀数组 or 暴力+strstr()函数 最长公共子串

    题目链接:https://vjudge.net/problem/POJ-1226 Substrings Time Limit: 1000MS   Memory Limit: 10000K Total ...

  6. 病毒木马查杀实战第025篇:JS下载者脚本木马的分析与防御

    前言 这次我与大家分享的是我所总结的关于JS下载者脚本木马的分析与防御技术.之所以要选择这样的一个题目,是因为在日常的病毒分析工作中,每天都会遇到这类病毒样本,少则几个,多则几十个(当然了,更多的样本 ...

  7. strstr 函数的实现

    strstr函数:返回主串中子字符串的位置后的所有字符. #include <stdio.h> const char *my_strstr(const char *str, const c ...

  8. 【Mocha.js 101】钩子函数

    前情提要 在上一篇文章<[Mocha.js 101]同步.异步与 Promise>中,我们学会了如何对同步方法.异步回调方法以及 Promise 进行测试. 在本篇文章中,我们将了解到 M ...

  9. strstr函数的用法

    C语言函数 编辑 包含文件:string.h 函数名: strstr 函数原型:      extern char *strstr(char *str1, const char *str2); 语法: ...

  10. JS魔法堂:函数重载 之 获取变量的数据类型

    Brief 有时我们需要根据入参的数据类型来决定调用哪个函数实现,就是说所谓的函数重载(function overloading).因为JS没有内置函数重载的特性,正好给机会我们思考和实现一套这样的机 ...

随机推荐

  1. HTTP协议六种请求:GET,HEAD,PUT,DELETE,POST

    Http定义了与服务器交互的不同方法,标准Http协议支持六种请求方法,即: 1.GET 2.POST 3.PUT 4.Delete 5.HEAD 6.Options 最基本的方法有4种,分别是GET ...

  2. docker 资源限制之 cgroup

    1. Liunx cgroup 使用 namespace 隔离运行环境,使得进程像在独立环境中运行一样.然而,仅有隔离环境还不够,还得限制被 namespace 隔离的资源.否则,namespace ...

  3. AMBA Bus介绍_01

    AMBA总线概述 系统总线简介 AMBA 2.0 AHB - 高性能Bus APB - 外设Bus AHB ASB APB AHB 组成部分 APB组成部分 AMBA协议其他有关问题 DMA DMA ...

  4. P5707 【深基2.例12】上学迟到

    1.题目介绍 2.题解 这里只有两个稍微注意的点 2.1 s % v != 0(向上取整) 这里的话,若是结果不为整数,我们必须向上取整,必须保证空余时间永远大于所需时间! 2.2 ceil向上取整函 ...

  5. 【C/C++】宏参数多对一和宏部分替换

    宏参数多对一:使用分号分隔多参数 宏部分替换:替换需要转换的再与后续宏接续 #include <stdio.h> #define _MESS_FAILED() printf("% ...

  6. bootstrap : 解决使图片全屏显示有空白边距的问题

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="utf-8 ...

  7. KVM命令行Clone虚拟机的快速处理

    KVM命令行Clone虚拟机的快速处理 背景 鲲鹏+银河麒麟的测试环境 想着可以使用 KVM的方式创建虚拟机 virt-manager 有个clone虚拟机的提示, 但是发现没有创建新存储卷下面的磁盘 ...

  8. [转帖]ls 只显示目录

    https://www.cnblogs.com/lavin/p/5912369.html 只显示目录: ls -d */ 在实际应用中,我们有时需要仅列出目录,下面是 4 种不同的方法. 1. 利用 ...

  9. [转帖]tikv性能参数调优

    https://www.cnblogs.com/FengGeBlog/p/10278368.html#:~:text=max-%20bytes%20-for-level-%20base%20%3D%2 ...

  10. RPM安装的Oracle19c 修改init.ora进行修复以及最简单开机启动Oracle的方法

    RPM安装的Oracle19c 修改init.ora进行修复以及最简单开机启动Oracle的方法 背景 今天开始使用自己心的ThinkBook14 的笔记本 因为已经没有了 Linux测试环境供我使用 ...