📜  使用Trie打印字典中所有可能的单词组合(1)

📅  最后修改于: 2023-12-03 14:49:51.872000             🧑  作者: Mango

使用Trie打印字典中所有可能的单词组合

Trie 是一种非常有效的数据结构,用于实现字典。它可以快速地查找单词,还可以打印出字典中所有可能的单词组合。

什么是 Trie?

Trie,也叫字典树,是一种树形结构。Trie 的每个节点都代表一个字符,它的子节点代表下一个字符。

通常情况下,Trie 的根节点代表一个空字符,如果在一个 Trie 中插入了单词 "abc",那么树的结构如下:

       root
        /
       a
      /
     b
    /
   c

这个 Trie 具有以下属性:

  • 每个节点都包含一个字符。
  • 从根到某个节点的路径上的字符组合起来,表示一个单词。
  • 每个节点的所有子节点包含的字符都不相同。

因此,使用 Trie 可以快速地查找单词,还可以打印出字典中所有可能的单词组合。

如何实现?

这里给出使用 Python 实现 Trie 的基本步骤:

定义 TrieNode 类

TrieNode 类代表 Trie 的节点。它包含两个属性:

  • children 表示所有子节点
  • is_word 标记该节点是否为单词的结尾
class TrieNode:
    def __init__(self):
        self.children = {}
        self.is_word = False
定义 Trie 类

Trie 类代表整个 Trie。它包含一个属性 root,表示 Trie 的根节点。

class Trie:
    def __init__(self):
        self.root = TrieNode()
插入单词

插入单词的基本思路是,从 Trie 的根节点开始,逐个查找单词的字符是否存在于子节点中,如果不存在则插入一个新的节点。

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

    def insert(self, word: str) -> None:
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_word = True
搜索单词

搜索单词的基本思路是,从 Trie 的根节点开始,逐个查找单词的字符是否存在于子节点中,如果存在则继续向下查找,否则返回 False。

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

    def insert(self, word: str) -> None:
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_word = True

    def search(self, word: str) -> bool:
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.is_word
前缀搜索

在 Trie 中搜索带有特定前缀的单词的方法与搜索整个单词的方法相似,唯一的区别是在 Trie 的底部找到的节点不一定是单词的结尾。

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

    def insert(self, word: str) -> None:
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_word = True

    def search(self, word: str) -> bool:
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.is_word

    def starts_with(self, prefix: str) -> bool:
        node = self.root
        for char in prefix:
            if char not in node.children:
                return False
            node = node.children[char]
        return True
迭代法

Trie 的迭代法思路为在整个 trie 数中,提取 key,并进行深度优先查找,如果 words 中存在该单词,则将其添加到 result 返回数组中

class Trie:
    def __init__(self):
        self.children = {}
        self.is_word = False
        
    def insert(self, word: str) -> None:
        node = self
        for c in word:
            if c not in node.children:
                node.children[c] = Trie()
            node = node.children[c]
        node.is_word = True
    
    def getWords(self, prefix):
        result = []
        cur_node = self
        for c in prefix:
            if c not in cur_node.children:
                return result
            cur_node = cur_node.children[c]
        stack = [(cur_node, prefix)]
        while stack:
            node, prefix = stack.pop()
            if node.is_word:
                result.append(prefix)
            
            for letter, child_node in node.children.items():
                stack.append((child_node, prefix+letter))
        return result
总结

使用 Trie 实现字典,可以快速查找单词,预测下一个可能的单词,以及打印出所有可能的单词组合。实现 Trie 的基本步骤是定义 TrieNode 类,定义 Trie 类,插入单词,搜索单词,以及前缀搜索。