leetcode刷题记录-720. 词典中最长的单词

143 阅读1分钟

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;
};

image.png