题目
给出一个字符串数组 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]
都只包含小写字母。
思路
- 将字符串按长度升序,以及字典降序规则排序
- 遍历字典,判断单词除去最后一个字母后是否在前面出现过,出现过则更新结果
- 因为按照字典规则降序排列,所以最后的结果是字典中字典序最小的单词
代码
class Solution:
def longestWord(self, words: List[str]) -> str:
words.sort(key=lambda x: (-len(x),x), reverse = True)
condidate = {""}
res = ""
for word in words:
if word[:-1] in condidate:
res = word
condidate.add(word)
return res
复杂度
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)