Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
今天的题目为简单,简单题最重要的是思路,这道题主要是要了解 sort 的一个排序机制,知道这个整个题目就会变得和简单。
每日一题
今天的题目是 720. 词典中最长的单词,难度为简单
-
给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。
-
若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。
示例 1:
输入:words = ["w","wo","wor","worl", "world"]
输出:"world"
解释: 单词"world"可由"w", "wo", "wor", 和 "worl"逐步添加一个字母组成。
示例 2:
输入:words = ["a", "banana", "app", "appl", "ap", "apply", "apple"]
输出:"apple"
解释:"apply" 和 "apple" 都能由词典中的单词组成。但是 "apple" 的字典序小于 "apply"
提示:
- 1 <= words.length <= 1000
- 1 <= words[i].length <= 30
- 所有输入的字符串 words[i] 都只包含小写字母。
题解
set表解题
sort 方法
题目要我们去找一个从一个字母一直排列到最长的单词,首先想到需要去排序,这里就涉及到 js 中 sort() 的排序机制,它默认是进行字典序排序的,也就是无论你输入的是什么,它都会去对比第一个字符的 ASCII 来进行排序,第一个一样则对比下一个。比如我们看一下下面这段代码:
const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]
const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// expected output: Array [1, 100000, 21, 30, 4]
再比如题目给出的数据 - ["a", "banana", "app", "appl", "ap", "apply", "apple"] 在排序后会变成:
const array1 = ["a", "banana", "app", "appl", "ap", "apply", "apple"];
array1.sort();
console.log(array1);
// expected output: Array ["a", "ap", "app", "appl", "apple", "apply", "banana"]
这样我们就能够很清楚的看到,对于前面字母相同的字符串都被有序的排列起来了,这样就很符合题目要求的,每次递增的方式。
set 解题
那么再有了上面的基础之后,我们就可以去遍历上面排序好的数组,每次只要去判断一下,新的字符串在裁掉最后一个字母之后,set表中是否存在,存在则满足题目要求,加入set表,不存在就是不满足题目要求,跳过
然后再每次要加入set表的时候,都要去更新答案的值,判断当前这个满足要求的字符串长度和答案相对比,更长的话就相应的进行更新
最后就能够得到答案最长的字符串长度
/**
* @param {string[]} words
* @return {string}
*/
const longestWord = (words) => {
words.sort();
let res = "";
const set = new Set([""]);
for (const word of words) {
if (set.has(word.slice(0, -1))) {
if (word.length > res.length) {
res = word;
}
set.add(word);
}
}
return res;
};