leetcode 之 720. 词典中最长的单词

135 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第23天,点击查看活动详情

题目描述

原题链接 :

720. 词典中最长的单词 - 力扣(LeetCode) (leetcode-cn.com)

给出一个字符串数组 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] 都只包含小写字母。

思路分析

空字符串是符合要求的单词

在符合要求的单词末尾添加一个字母,得到的新单词是符合要求的单词;

首先需要把words数组进行排序,排序规则是按照单词的长度升序排列,如果单词长度相同则按照字典序降序排序,排序之后,可以确保当遍历到每个单词时,比该单词短的全部单词已经遍历过,且每次遇到符合要求的单词一定是最长且字典序最小的单词

将答案初始化为空字符串,使用哈希表存储所有符合要求的单词,初始时将空字符串加入哈希集合,遍历数组words,对于每个单词,判断当前单词去掉最后一个字母之后的前缀是否在哈希表中,如果该前缀在哈希集合中,则当前单词是符合要求的单词,将当前单词加入哈希集合,并将答案更新为当前单词

AC 代码

class Solution {
    public String longestWord(String[] words) {
        Arrays.sort(words,(a,b) ->{
            if(a.length() != b.length()){
                return a.length() - b.length();
            } else {
                return b.compareTo(a);
            }
        });

        String longest = "";
        Set<String> set = new HashSet<String>();
        set.add("");
        int n = words.length;

        for(int i = 0; i < n; i++){
            String word = words[i];
            if(set.contains(word.substring(0,word.length() - 1))){
                set.add(word);
                longest = word;
            }
        }
        return longest;
    }
}