返回

利用 Trie 树的原理,轻松破解 LeetCode 720 题中的字典单词查找难题

后端

剖析 LeetCode 720 题:“词典中最长的单词”

LeetCode 720 题“词典中最长的单词”是一道难度为简单的算法题,题目如下:

给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的单词,如果有多个长度相同的最长单词,返回字典序最小的单词。

为了解决这个问题,我们可以使用 Trie 树来构建字典。Trie 树是一种树形数据结构,专为存储字符串而设计,具有高效查找和前缀匹配的优点。具体而言,我们可以将字典中的每个单词插入 Trie 树中,然后从 Trie 树的根节点开始,深度优先搜索每个分支,直到找到最长的单词或遇到空分支。

Trie 树的数据结构

Trie 树是一种树形数据结构,专为存储字符串而设计,具有高效查找和前缀匹配的优点。Trie 树的每个节点代表一个字符,而从根节点到叶节点的路径代表一个字符串。Trie 树具有以下特点:

  • 每个节点最多有 26 个子节点,分别对应 26 个小写字母。
  • 每个节点都有一个标记,表示该节点是否代表一个单词的结尾。
  • Trie 树的高度等于最长字符串的长度。

使用 Trie 树解决 LeetCode 720 题

我们可以使用 Trie 树来解决 LeetCode 720 题“词典中最长的单词”这个问题。具体而言,我们可以将字典中的每个单词插入 Trie 树中,然后从 Trie 树的根节点开始,深度优先搜索每个分支,直到找到最长的单词或遇到空分支。

为了找到最长的单词,我们需要记录下当前搜索到的最长单词的长度和单词本身。当我们遇到一个叶节点时,如果该叶节点的标记为 True,则表示该节点代表一个单词的结尾,此时我们可以检查该单词的长度是否大于当前记录的最长单词的长度。如果是,则更新最长单词的长度和单词本身。

如果我们遇到一个空分支,则表示我们已经无法继续搜索,此时我们可以返回当前记录的最长单词。

代码实现

class TrieNode:
    def __init__(self):
        self.children = [None]*26
        self.is_word = False

class Trie:
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word):
        node = self.root
        for char in word:
            index = ord(char) - ord('a')
            if not node.children[index]:
                node.children[index] = TrieNode()
            node = node.children[index]
        node.is_word = True

    def longest_word(self):
        longest_word = ""
        longest_length = 0

        def dfs(node, current_word):
            nonlocal longest_word, longest_length
            if node.is_word and len(current_word) > longest_length:
                longest_word = current_word
                longest_length = len(current_word)

            for i in range(26):
                if node.children[i]:
                    dfs(node.children[i], current_word + chr(i + ord('a')))

        dfs(self.root, "")
        return longest_word

words = ["hello", "world", "leetcode", "longest", "word"]
trie = Trie()
for word in words:
    trie.insert(word)

print(trie.longest_word())

复杂度分析

  • 时间复杂度:插入 Trie 树的时间复杂度为 O(n * m),其中 n 是单词的个数,m 是单词的平均长度。搜索 Trie 树的时间复杂度为 O(m),其中 m 是待搜索单词的长度。
  • 空间复杂度:Trie 树的空间复杂度为 O(n * m),其中 n 是单词的个数,m 是单词的平均长度。

总结

在本文中,我们使用 Trie 树的数据结构来解决了 LeetCode 720 题“词典中最长的单词”这个问题。我们首先将字典中的每个单词插入 Trie 树中,然后从 Trie 树的根节点开始,深度优先搜索每个分支,直到找到最长的单词或遇到空分支。

Trie 树是一种非常强大的数据结构,它具有高效查找和前缀匹配的优点。Trie 树可以用于解决许多字符串相关的问题,例如单词查找、自动补全和拼写检查。