壹 ❀ 引

今天来做一道题目贼长,但做起来不难的题,为啥昨天前天没写呢,因为题目太简单了,没收获额外有用信息,已知的知识反复写就有些浪费时间了。今天的题目来自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方法的更多相关文章

  1. 在Linux系统下有一个目录/usr/share/dict/ 这个目录里包含了一个词典的文本文件,我们可以利用这个文件来辨别单词是否为词典中的单词。

    #!/bin/bash s=`cat /usr/share/dict/linux.words` for i in $s; do if [ $1 = $i ];then echo "$1 在字 ...

  2. 【LeetCode】面试题62. 圆圈中最后剩下的数字 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 约瑟夫环 日期 题目地址:https://leetco ...

  3. javascript面试题:如何把一句英文每个单词首字母大写?

    上周看到大家在JS群讨论如何把一句英文句子单词收割字母大写,大家都说用正则简单,对于正则还是有点模糊,于是乎自己敲了下 //面试题:如何把一句英文每个单词首字母大写? var str="wh ...

  4. Android 中View的绘制机制源代码分析 三

    到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...

  5. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  6. [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 ...

  7. [LeetCode] Reverse Words in a String 翻转字符串中的单词

    Given an input string, reverse the string word by word. For example, Given s = "the sky is blue ...

  8. [LeetCode] Longest Word in Dictionary 字典中的最长单词

    Given a list of strings words representing an English Dictionary, find the longest word in words tha ...

  9. C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解

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

  10. Leetcode#557. Reverse Words in a String III(反转字符串中的单词 III)

    题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输 ...

随机推荐

  1. python · ssh · SQL | python 连接远程 SQL 数据库

    python 连接本地 SQL 的 教程存档. 如果要连接远程的 SQL 数据库,需要先开一个 ssh 连接,在 ssh 连接里写 pymysql 的 connect 代码. 代码如下: ''' pi ...

  2. 【C++】static 静态成员

    静态成员 静态成员包括静态数据成员和静态成员函数,提供了同类对象间数据成员的共享机制 静态成员不是某个对象的成员,是类所有对象的共享成员,只建立一个成员副本 静态成员的定义与引用 定义格式:stati ...

  3. CSS 动画 : 创建 3D 立方体

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.11)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  5. [转帖]Oracle如何重启mmon/mmnl进程(AWR自动采集)

    https://www.cnblogs.com/jyzhao/p/10119854.html 学习一下 环境:Oracle 11.2.0.4 RAC现象:sysaux空间满导致无法正常生成快照,清理空 ...

  6. [转帖]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 ...

  7. [转帖]Module ngx_http_v2_module

    https://nginx.org/en/docs/http/ngx_http_v2_module.html#:~:text=Sets%20the%20maximum%20number%20of%20 ...

  8. [转帖]tidb 修改root密码

    http://blog.51yip.com/tidb/2452.html   通过 {pd-ip}:{pd-port}/dashboard 登录 TiDB Dashboard,登录用户和口令为 TiD ...

  9. 关于sar的学习

    关于sar的学习 背景 公司一套基于某冷门Python架构的系统前几天出现异常卡顿. 当时安装的时候必须使用ubuntu系统. 所以当时默认安装的ubuntu1804, 本来想尝试使用一下sar查看卡 ...

  10. [转帖]ansible小结(七)常用模块

    ansible小结(七)常用模块 http://www.361way.com/ansible-modules/4415.html   在上一篇中介绍了commands部分模块,本篇承接上篇介绍下常用的 ...