720. 词典中最长的单词
原始题目链接:https://leetcode-cn.com/problems/longest-word-in-dictionary/
给出一个字符串数组 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”
解题思路:
先排序,按照题目的要求,字符串长度是升序的,字母的降序的,使用sort函数和key的lambda结合进行排序,然后遍历排序的数组,再使用一个集合去验证当前遍历的单词是不是由其他单词组成的。最后返回答案单词即可。
代码实现:
class Solution:
def longestWord(self, words: List[str]) -> str:
# 根据题目要求
# 将数组中的元素按照单词的长度递增排序,按照字符的字典序降序排序
# 这样排好序后的数组元素,在遍历的时候直接按照要求查找就满足返回的答案
words.sort(key=lambda x : (-len(x), x), reverse=True)
# 定义答案单词字符串,初始化为空串
ans = ""
# 定义一个哈希表,这里使用set集合
# 用来检验这个单词是否是其他单词逐步添加一个字母组成的
# 注意集合和字典的区别,集合初始化必须有值
candidates = {""}
# 开始遍历words
for word in words:
# 当前单词去掉最后一个字母如果在集合中
# 就满足题意:该单词word是尤其他单词逐步添加一个字母组成的
if word[:-1] in candidates:
ans = word
candidates.add(word)
return ans
参考文献:
https://leetcode-cn.com/problems/longest-word-in-dictionary/solution/ci-dian-zhong-zui-chang-de-dan-ci-by-lee-k5gj/