JS leetcode 检查单词是否为句中其他单词的前缀 解题分析,活用startsWith方法

壹 ❀ 引
今天来做一道题目贼长,但做起来不难的题,为啥昨天前天没写呢,因为题目太简单了,没收获额外有用信息,已知的知识反复写就有些浪费时间了。今天的题目来自leetcode1455. 检查单词是否为句中其他单词的前缀,题目描述如下:
给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若干用 单个空格 分隔的单词组成。
请你检查检索词 searchWord 是否为句子 sentence 中任意单词的前缀。
如果 searchWord 是某一个单词的前缀,则返回句子 sentence 中该单词所对应的下标(下标从 1 开始)。
如果 searchWord 是多个单词的前缀,则返回匹配的第一个单词的下标(最小下标)。
如果 searchWord 不是任何单词的前缀,则返回 -1 。
字符串 S 的 「前缀」是 S 的任何前导连续子字符串。示例 1:
输入:sentence = "i love eating burger", searchWord = "burg"
输出:4
解释:"burg" 是 "burger" 的前缀,而 "burger" 是句子中第 4 个单词。
示例 2:
输入:sentence = "this problem is an easy problem", searchWord = "pro"
输出:2
解释:"pro" 是 "problem" 的前缀,而 "problem" 是句子中第 2 个也是第 6 个单词,但是应该返回最小下标 2 。
示例 3:
输入:sentence = "i am tired", searchWord = "you"
输出:-1
解释:"you" 不是句子中任何单词的前缀。
示例 4:
输入:sentence = "i use triple pillow", searchWord = "pill"
输出:4
示例 5:
输入:sentence = "hello from the other side", searchWord = "they"
输出:-1
提示:
1 <= sentence.length <= 100
1 <= searchWord.length <= 10
sentence 由小写英文字母和空格组成。
searchWord 由小写英文字母组成。
前缀就是紧密附着于词根的语素,中间不能插入其它成分,并且它的位置是固定的——-位于词根之前。
我们来简单分析题目,提取解题信息,再说解题思路。
贰 ❀ 解题思路
题目虽然看着贼长,要求其实很简单,给定一串字符sentence 作为句子,看句子中是否有某个单词的前缀为searchWord ,假设有或者有多个,返回第一个单词的下标(注意这里的下标从1开始),如果没有则返回-1。
由于题目已经清晰的给出了每个单词用空格分隔,因此这里我们完全可以使用split按空格切割成数组。其次,由于题目不存在大写情况,这里的searchWord 完全可以作为正则的匹配条件,所以我的本能第一是这样:
/**
* @param {string} sentence
* @param {string} searchWord
* @return {number}
*/
var isPrefixOfWord = function (sentence, searchWord) {
// 将searchWord作为正则匹配条件
let regexp = new RegExp("^" + searchWord);
//利用findIndex找到第一个符合条件的字符
let index = sentence.split(" ").findIndex(item => regexp.test(item));
//返回字符下标或者-1
return index > -1 ? index + 1 : index;
};
比较遗憾,这段代码的效率并不高,只击败了百分之七的用户。
所以在想有没有更高效的做法,比如不用正则。这里我又想到了indexOf,此方法可以判断字符中是否包含某个字符,由于题目要求是单词前缀,所以indexOf不仅要有,获取的还必须是从0开始,比如:
"abc".indexOf("ab");//0 √
"aab".indexOf("ab");//1 ×
所以又有了这段实现:
/**
* @param {string} sentence
* @param {string} searchWord
* @return {number}
*/
var isPrefixOfWord = function (sentence, searchWord) {
// 直接判断每个单词的indexOf是否是0即可
let index = sentence.split(" ").findIndex(item => item.indexOf(searchWord) === 0);
return index > -1 ? index + 1 : index;
};
这段实现就快了很多,击败了百分之七十多的人。
有没有更绝的做法呢,我在评论区看到了一个"令人发指"的API,用起来那是相当过分!那就是ES6中新增的startsWith方法,此方法返回一个布尔值,用于判断参数字符串是否在原字符串的头部,比如:
'hi,echo'.startsWith('hi');//true
'hi,echo'.startsWith('echo');//false
'hi,echo'.startsWith('echo',3);//true
通过上面的例子可以发现此方法接受2个参数,第一个是你希望检索的字符,第二个可选,是你希望开始检索的下标,如果不提供则默认为0。
那么知道这个之后,我们就可以实现这段代码:
/**
* @param {string} sentence
* @param {string} searchWord
* @return {number}
*/
var isPrefixOfWord = function (sentence, searchWord) {
// 直接判断每个单词的indexOf是否是0即可
let index = sentence.split(" ").findIndex(item => item.startsWith(searchWord));
return index > -1 ? index + 1 : index;
};

然后,击败了99.47%的用户,哈哈哈哈,可能,这是我现在少有能感觉到的快乐吧。
心情不好,虽然这篇博客不长,还是破例用一张我喜欢的封面图,去学vue去了,那么这些话是我在对谁说呢?
JS leetcode 检查单词是否为句中其他单词的前缀 解题分析,活用startsWith方法的更多相关文章
- 在Linux系统下有一个目录/usr/share/dict/ 这个目录里包含了一个词典的文本文件,我们可以利用这个文件来辨别单词是否为词典中的单词。
#!/bin/bash s=`cat /usr/share/dict/linux.words` for i in $s; do if [ $1 = $i ];then echo "$1 在字 ...
- 【LeetCode】面试题62. 圆圈中最后剩下的数字 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 约瑟夫环 日期 题目地址:https://leetco ...
- javascript面试题:如何把一句英文每个单词首字母大写?
上周看到大家在JS群讨论如何把一句英文句子单词收割字母大写,大家都说用正则简单,对于正则还是有点模糊,于是乎自己敲了下 //面试题:如何把一句英文每个单词首字母大写? var str="wh ...
- Android 中View的绘制机制源代码分析 三
到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
- [LeetCode] Reverse Words in a String II 翻转字符串中的单词之二
Given an input string, reverse the string word by word. A word is defined as a sequence of non-space ...
- [LeetCode] Reverse Words in a String 翻转字符串中的单词
Given an input string, reverse the string word by word. For example, Given s = "the sky is blue ...
- [LeetCode] Longest Word in Dictionary 字典中的最长单词
Given a list of strings words representing an English Dictionary, find the longest word in words tha ...
- C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...
- Leetcode#557. Reverse Words in a String III(反转字符串中的单词 III)
题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输 ...
随机推荐
- python · ssh · SQL | python 连接远程 SQL 数据库
python 连接本地 SQL 的 教程存档. 如果要连接远程的 SQL 数据库,需要先开一个 ssh 连接,在 ssh 连接里写 pymysql 的 connect 代码. 代码如下: ''' pi ...
- 【C++】static 静态成员
静态成员 静态成员包括静态数据成员和静态成员函数,提供了同类对象间数据成员的共享机制 静态成员不是某个对象的成员,是类所有对象的共享成员,只建立一个成员副本 静态成员的定义与引用 定义格式:stati ...
- CSS 动画 : 创建 3D 立方体
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.11)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- [转帖]Oracle如何重启mmon/mmnl进程(AWR自动采集)
https://www.cnblogs.com/jyzhao/p/10119854.html 学习一下 环境:Oracle 11.2.0.4 RAC现象:sysaux空间满导致无法正常生成快照,清理空 ...
- [转帖]ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
1.报错信息 ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on acces ...
- [转帖]Module ngx_http_v2_module
https://nginx.org/en/docs/http/ngx_http_v2_module.html#:~:text=Sets%20the%20maximum%20number%20of%20 ...
- [转帖]tidb 修改root密码
http://blog.51yip.com/tidb/2452.html 通过 {pd-ip}:{pd-port}/dashboard 登录 TiDB Dashboard,登录用户和口令为 TiD ...
- 关于sar的学习
关于sar的学习 背景 公司一套基于某冷门Python架构的系统前几天出现异常卡顿. 当时安装的时候必须使用ubuntu系统. 所以当时默认安装的ubuntu1804, 本来想尝试使用一下sar查看卡 ...
- [转帖]ansible小结(七)常用模块
ansible小结(七)常用模块 http://www.361way.com/ansible-modules/4415.html 在上一篇中介绍了commands部分模块,本篇承接上篇介绍下常用的 ...