Given a list of strings words
representing an English Dictionary, find the longest word in words
that can be built one character at a time by other words in words
. If there is more than one possible answer, return the longest word with the smallest lexicographical order.
If there is no answer, return the empty string.
Example 1:
Input: words = ["w","wo","wor","worl", "world"] Output: "world" Explanation: The word "world" can be built one character at a time by "w", "wo", "wor", and "worl".
Example 2:
Input: words = ["a", "banana", "app", "appl", "ap", "apply", "apple"] Output: "apple" Explanation: Both "apply" and "apple" can be built from other words in the dictionary. However, "apple" is lexicographically smaller than "apply".
Note:
- All the strings in the input will only contain lowercase letters.
- The length of
words
will be in the range[1, 1000]
. - The length of
words[i]
will be in the range[1, 30]
.
排序+set解法
class Solution(object): def longestWord(self, words): """ :type words: List[str] :rtype: str """ # use greey algo # find the most length word that can be built one character at a time by other words in words words_set = set([""]) words.sort() ans = "" for word in words: if word[:-1] in words_set: if len(word) > len(ans): ans = word words_set.add(word) return ans
或者是trie:
class Node(object): def __init__(self, val=""): self.val = val self.subs = collections.defaultdict(Node) class Trie(object): def __init__(self): self.root = Node("") def insert(self, s): node = self.root for c in s: node = node.subs[c] node.val = s def longest_word(self): self.ans = "" def dfs(node): for k, n in node.subs.items(): if n.val: if len(n.val)>len(self.ans) or (len(n.val)==len(self.ans) and n.val<self.ans): self.ans = n.val dfs(n) dfs(self.root) return self.ans class Solution(object): def longestWord(self, words): """ :type words: List[str] :rtype: str """ trie = Trie() for word in words: trie.insert(word) return trie.longest_word()