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。
好了,关于这道题就说到这了。
JS leetcode 实现strStr()函数 题解分析的更多相关文章
- #leetcode刷题之路28-实现 strStr() 函数
实现 strStr() 函数.给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返回 ...
- 【LeetCode字符串#05】基于个人理解的KMP算法图解,以及应用到strStr()函数实现
KMP算法(用于实现 strStr()) strStr()函数是用来在一个字符串中搜索是否存在另一个字符串的函数,其匹配字符串方式为KMP算法 KMP算法基础理论 假设有如下两个字符串 文本串 aab ...
- Leetcode 10. 正则表达式匹配 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- POJ1226 Substrings ——后缀数组 or 暴力+strstr()函数 最长公共子串
题目链接:https://vjudge.net/problem/POJ-1226 Substrings Time Limit: 1000MS Memory Limit: 10000K Total ...
- 病毒木马查杀实战第025篇:JS下载者脚本木马的分析与防御
前言 这次我与大家分享的是我所总结的关于JS下载者脚本木马的分析与防御技术.之所以要选择这样的一个题目,是因为在日常的病毒分析工作中,每天都会遇到这类病毒样本,少则几个,多则几十个(当然了,更多的样本 ...
- strstr 函数的实现
strstr函数:返回主串中子字符串的位置后的所有字符. #include <stdio.h> const char *my_strstr(const char *str, const c ...
- 【Mocha.js 101】钩子函数
前情提要 在上一篇文章<[Mocha.js 101]同步.异步与 Promise>中,我们学会了如何对同步方法.异步回调方法以及 Promise 进行测试. 在本篇文章中,我们将了解到 M ...
- strstr函数的用法
C语言函数 编辑 包含文件:string.h 函数名: strstr 函数原型: extern char *strstr(char *str1, const char *str2); 语法: ...
- JS魔法堂:函数重载 之 获取变量的数据类型
Brief 有时我们需要根据入参的数据类型来决定调用哪个函数实现,就是说所谓的函数重载(function overloading).因为JS没有内置函数重载的特性,正好给机会我们思考和实现一套这样的机 ...
随机推荐
- Windows 下 Outlook 点击关闭最小化和开机自动运行
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- VSCODE中GIT配置
1.问题:无法正常提交 问题描述 *使用vscode提交就会一直卡住**. 参考方案链接:VS CODE GIT 500 问题处理-pudn.com 根据这位博主的描述,应当是设置的这里选择的默认选项 ...
- 【lvgl-micropython】官方源码之ports/unix 编译报错
lv_micropython/ports/unix make 报错 编译环境如下 这是缺少SDL2库导致的 sudo apt-get install libsdl2-2.0 sudo apt-get ...
- 2023年江苏“领航杯”MISC一个很有意思的题目(别把鸡蛋放在同一个篮子里面)
别把鸡蛋放在同一个篮子里面 题目附件:https://wwzl.lanzoue.com/i6HmX16finnc 1.题目信息 解压压缩包打开附件,获得5141个txt文档,每个文档都有内容,发现是b ...
- [转帖]数据库连接池选型 Druid vs HikariCP性能对比
这里主要比较HikariCP 和阿里的Druid springboot 现在官方默认的数据库连接池是 HikariCP,HikariCP的性能从测试的数据上来看也是最高的. 先来看下这个著名的issu ...
- [转帖]Docker资源(CPU/内存/磁盘IO/GPU)限制与分配指南
https://zhuanlan.zhihu.com/p/417472115 什么是cgroup? cgroups其名称源自控制组群(control groups)的简写,是Linux内核的一个功能, ...
- [转帖]【有效解决】Edge浏览器提示你的连接不是专用连接怎么办?
https://www.xitongzhijia.net/xtjc/20230524/290887.html Win11正式版iso镜像最新(22H2新版) V2023 大小:4.22 GB类别:Wi ...
- [转帖]lsblk命令详解
https://www.cnblogs.com/ishmaelwanglin/p/11043918.html lsblk命令用来查看block设备的信息. 主要应用场景: 获取wwnid,获取块设备列 ...
- 【转帖】读懂什么是RDMA
一.什么是RDMA1.RDMA主要体现 2.如何理解RDMA和TCP技术的区别?3.使用RDMA的好处包括: 二.什么是RoCE?1. RDMA协议包含:Infiniband(IB)2. 为什 ...
- Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑
Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑 摘要 本周研发同事反馈现场有一个问题. 客户使用mysql的数据库(Windows平台) 然后在多表union all 创建 ...