壹 ❀ 引

今天来做一道题目贼长,但做起来不难的题,为啥昨天前天没写呢,因为题目太简单了,没收获额外有用信息,已知的知识反复写就有些浪费时间了。今天的题目来自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. 传说中 PUE 预测精度高达 0.005 的工作

    杨震, 赵静洲, 林依挺 等. 数据中心 PUE 能效优化的机器学习方法. 系统工程理论与实践, 2022, 42(3): 811-832 省流: 这是 2020 年的论文,用神经网络进行了认真的 P ...

  2. docker 安装 nacos

    转载请注明出处: https://www.jianshu.com/p/54f6da71ac48

  3. P5729 【深基5.例7】工艺品制作

    1.题目介绍 [深基5.例7]工艺品制作 题目描述 现有一个长宽高分别为 \(w,x,h\) 组成的实心玻璃立方体,可以认为是由 \(1\times1\times1\) 的数个小方块组成的,每个小方块 ...

  4. CoreDNS -- DNS服务与服务发现

    CoreDNS -- DNS服务与服务发现 DNS服务器 手册:https://coredns.io/manual/toc/ Github:https://github.com/coredns/cor ...

  5. 【面试题精讲】Mysql如何实现乐观锁

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 文章更新计划 系列文章地址 在 MySQL 中,可以通过使用乐 ...

  6. [转帖]Nginx内置变量以及日志格式变量参数详解

    https://www.cnblogs.com/wajika/p/6426270.html $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求 ...

  7. [转帖]总成本降低80%,支付宝使用OceanBase的历史库实践

    https://open.oceanbase.com/blog/5377309696 为解决因业务增长引发的数据库存储空间问题,支付宝基于 OceanBase 数据库启动历史库项目,通过历史数据归档. ...

  8. Raid卡型号的简单辨认与问题发现过程

    Raid卡型号的简单辨认与问题发现过程 背景 同事给了一个awr报告. !-_-! 其实我看不懂. 但是他告诉我 有大量的log file sync 的等待事件. 然后又给了一套其他的文件, 发现lo ...

  9. [转帖]记录一则enq: TX - row lock contention的分析过程

    https://www.cnblogs.com/jyzhao/p/8628184.html 故障描述:与客户沟通,初步确认故障范围大概是在上午的8:30-10:30之间,反应故障现象是Tomcat的连 ...

  10. [转帖]datax安装+配置+使用文档

    1 DataX离线同步工具DataX3.0介绍 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hiv ...