返回

字典中最长的单词

后端





## 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. 词典中最长的单词 问题。我们讨论了这两种方法的优缺点,并提供了代码示例。希望这篇文章能够帮助您更好地理解这个问题以及如何解决它。