题目描述:
给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。
若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。
示例:
输入:words = [“w”,“wo”,“wor”,“worl”, “world”]
输出:“world”
解释: 单词"world"可由"w", “wo”, “wor”, 和 "worl"逐步添加一个字母组成。
题解: 记住leetcode 208的代码模板,然后根据题意小改一下其中的函数就能解决这道题了!易错点是要谨记当前字符的flag标志是存储在它的孩子节点里即value这个字典中
class Solution:
def longestWord(self, words: List[str]) -> str:
#这个words是空的或者长度为0的话,就说明里面没有任何字符串
if words is None or len(words) == 0:
return ""
obj = Trie()
#把每个单词放进前缀树里
for word in words:
obj.insert(word)
#寻找符合条件的单词
result = ""
for word in words:
#如果word的长度大于当前result或者长度一样但字典序更小,这时这个word就可能会成为新的result,否则直接跳过
#判断字典序直接就通过字符串比较大小就行
if len(word) > len(result) or (len(word)==len(result) and word < result):
iseligible = obj.search(word)
if not iseligible:
continue
result = word
return result
class Trie:
def __init__(self):
"""
Initialize your data structure here.
"""
self.lookup = {}
def insert(self, word: str) -> None:
"""
Inserts a word into the trie.
"""
tree = self.lookup
for a in word:
#判断是否有a这个key
if a not in tree:
#这个哈希表中的key是字符, value表示孩子节点(新的一个哈希表)
tree[a] = {}
#覆盖之前的tree为孩子节点, self.lookup就是最终的整个大字典(即存放着所有节点)
tree = tree[a]
#结束标志符Flag
tree["#"] = "#"
tree["value"] = word
def search(self, word: str) -> bool:
"""
Returns if the word is in the trie.
"""
tree = self.lookup
for a in word:
if a not in tree:
#if "#" not in tree:
return False
tree = tree[a]
#这里容易错,要谨记当前字符的flag标志是存储在它的孩子节点里即value这个字典中
if "#" not in tree:
return False
return True