题目:
题目链接: https://leetcode-cn.com/problems/longest-word-in-dictionary/
解题思路:
方法一:trie + dfs
trie : 前缀树
dfs : 深度优先搜索
将所有的单词插入到trie树中,然后进行深度优先搜索,查找最长的的单词
时间复杂度:,其中,w表示的是每个单词的长度
方法二:hash + 快排
因为这道题的特殊性:必须是单个字母逐步添加形成另外一个单词
所以可以使用hash表,key为字符串,val为是否是符合要求的字符串。然后对列表进行按照字符串长度的排序之后进行遍历,遍历逻辑如下:
- 如果当前字符串长度为1,则插入hash表,key = 当前字符串,val = True
- 如果当前字符串长度不为1,则判断当前字符串删除最后一个字符后的字符串,是否在hash表中
- 如果存在,则更新之前的字符串val = False,并插入当前新的字符串
- 如果不存在,说明之前没有能逐步形成当前字符串的前置字符串,直接跳过
- 对hash表进行遍历,查找最长的字符串的长度
- 将字符串长度为最长字符串长度的字符串筛选出来,从中选择字典序最靠前的
时间复杂度为:快排的时间复杂度为O(NlogN),遍历的时间复杂度为N,综合起来为O(NlogN)
代码实现:
方法一:
class Solution(object):
def longestWord(self, words):
Trie = lambda: collections.defaultdict(Trie)
trie = Trie()
END = True
for i, word in enumerate(words):
reduce(dict.__getitem__, word, trie)[END] = i
stack = trie.values()
ans = ""
while stack:
cur = stack.pop()
if END in cur:
word = words[cur[END]]
if len(word) > len(ans) or len(word) == len(ans) and word < ans:
ans = word
stack.extend([cur[letter] for letter in cur if letter != END])
return ans
方法二:
class Solution:
def longestWord(self, words: List[str]) -> str:
rec = collections.defaultdict(list)
words.sort(key = lambda item : len(item))
for idx, a in enumerate(words):
if len(a) == 1:
rec[a] = True
elif a[:-1] in rec:
rec[a] = True
rec[a[:-1]] = False
max_len = max([len(a) for a in rec if rec[a] == True])
res = [a for a in rec if rec[a] == True and len(a) == max_len]
res.sort()
return res[0]