一起养成写作习惯!这是我参与「掘金日新计划 · 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;
}
}