返回
字典中最长的单词
后端
2023-09-19 22:47:21
## LeetCode 720. 词典中最长的单词
**问题**
给定一个字典,找到字典中最长的单词。
**示例**
输入:["w", "wo", "wor", "worl", "world"]
输出:"world"
输入:["a", "banana", "app", "appl", "apple"]
输出:"apple"
**思路**
我们可以使用两种方法来解决这个问题:
* **哈希表**
我们可以使用哈希表来存储字典中的所有单词。然后,我们可以遍历字典中的每个单词,并检查它是否是另一个单词的前缀。如果它是另一个单词的前缀,那么我们就继续检查下一个单词。如果它不是另一个单词的前缀,那么我们就将其添加到哈希表中。最后,我们返回哈希表中最长的单词。
* **字典树**
我们可以使用字典树来存储字典中的所有单词。字典树是一种树形结构,每个节点代表一个字母。每个节点都有一个指向下一个字母的指针。当我们遇到一个单词时,我们可以从根节点开始,并沿着单词的字母指针移动。如果我们到达一个叶节点,那么我们就找到了一个单词。最后,我们返回字典树中最长的单词。
**代码示例**
```python
# 哈希表法
def longest_word(words):
"""
:type words: List[str]
:rtype: str
"""
# 将字典中的单词存储到哈希表中
hash_table = set(words)
# 初始化最长单词
longest_word = ""
# 遍历字典中的每个单词
for word in words:
# 检查该单词是否是另一个单词的前缀
is_prefix = False
for i in range(1, len(word)):
if word[:i] in hash_table:
is_prefix = True
break
# 如果该单词不是另一个单词的前缀,则将其添加到哈希表中
if not is_prefix:
hash_table.add(word)
# 如果该单词是另一个单词的前缀,则继续检查下一个单词
else:
continue
# 如果该单词比最长单词长,则将其更新为最长单词
if len(word) > len(longest_word):
longest_word = word
# 返回最长单词
return longest_word
# 字典树法
class TrieNode:
"""
字典树的节点
"""
def __init__(self):
# 指向下一个字母的指针
self.children = {}
# 是否是单词的结尾
self.is_word = False
class Trie:
"""
字典树
"""
def __init__(self):
# 根节点
self.root = TrieNode()
def insert(self, word):
"""
将单词插入字典树中
"""
# 从根节点开始
node = self.root
# 遍历单词的字母
for letter in word:
# 如果当前节点没有指向该字母的指针,则创建该指针
if letter not in node.children:
node.children[letter] = TrieNode()
# 移动到下一个节点
node = node.children[letter]
# 将该节点标记为单词的结尾
node.is_word = True
def longest_word(self):
"""
返回字典树中最长的单词
"""
# 从根节点开始
node = self.root
# 最长单词
longest_word = ""
# 遍历字典树
while node:
# 如果当前节点是单词的结尾,则更新最长单词
if node.is_word:
longest_word = max(longest_word, "".join(path))
# 继续遍历字典树
for letter, child_node in node.children.items():
path.append(letter)
node = child_node
break
# 返回最长单词
return longest_word
def longest_word(words):
"""
:type words: List[str]
:rtype: str
"""
# 创建字典树
trie = Trie()
# 将单词插入字典树中
for word in words:
trie.insert(word)
# 返回字典树中最长的单词
return trie.longest_word()
复杂度分析
-
哈希表法
- 时间复杂度:O(n^2),其中n是字典中的单词数。
- 空间复杂度:O(n),其中n是字典中的单词数。
-
字典树法
- 时间复杂度:O(n*k),其中n是字典中的单词数,k是字典中单词的平均长度。
- 空间复杂度:O(n*k),其中n是字典中的单词数,k是字典中单词的平均长度。
优缺点
-
哈希表法
- 优点:简单易懂,实现方便。
- 缺点:时间复杂度高,空间复杂度高。
-
字典树法
- 优点:时间复杂度低,空间复杂度低。
- 缺点:实现复杂,代码量多。
总结
在这篇文章中,我们介绍了如何使用哈希表和字典树两种方法来解决 LeetCode 上的 720. 词典中最长的单词 问题。我们讨论了这两种方法的优缺点,并提供了代码示例。希望这篇文章能够帮助您更好地理解这个问题以及如何解决它。