📅  最后修改于: 2023-12-03 15:22:21.096000             🧑  作者: Mango
Trie,也叫字典树,是一种用于快速查找和插入字符串的数据结构。对于一个字符串集合,Trie树可以高效地实现搜索、插入、删除等操作。下面我们将介绍如何使用Trie树来计算具有给定前缀的单词数。
Trie树是一棵有根树,其每个节点表示一个字符串中的字符。根节点表示空字符串,每个节点可能有多个子节点,代表不同的字符。在遍历Trie树时,节点的路径构成的字符串是从根节点到当前节点的所有字符构成的字符串。如果一个节点代表的字符串在原始字符串集合中,则该节点被标记为“结束节点”。
下面是一个Trie树的示例:
root
/ | \
c b a
/ \ \
o a t(end)
/ / \ \
w t r(end) e(end)
| |
s(end) n(end)
/ \
e(end) t(end)
|
s(end)
对于上面这个Trie树,可以看到它包含了诸如“cow”、“cat”、“car”、“bat”、“ban”等字符串,其中以“c”开头的字符串数量为3,以“ca”开头的字符串数量为2。
通过Trie树,我们可以高效地计算具有给定前缀的单词数。假设我们要计算以“ca”开头的字符串数量,只需要从根节点开始,沿着“c”->“a”的路径遍历Trie树,并记录到达该节点时是否为结束节点。当我们遍历到结尾节点时,如果该节点是结束节点,则表示以“ca”开头的字符串数量为1,否则数量为0。
以下是计算具有给定前缀的单词数的Python代码片段:
class TrieNode:
def __init__(self):
self.children = {}
self.is_end = False
self.count = 0
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word):
node = self.root
for ch in word:
if ch not in node.children:
node.children[ch] = TrieNode()
node = node.children[ch]
node.count += 1
node.is_end = True
def count_prefix(self, prefix):
node = self.root
for ch in prefix:
if ch not in node.children:
return 0
node = node.children[ch]
return node.count
# example usage
t = Trie()
t.insert("cow")
t.insert("cat")
t.insert("car")
t.insert("bat")
t.insert("ban")
print(t.count_prefix("c")) # output: 3
print(t.count_prefix("ca")) # output: 2
上述代码中,TrieNode
表示Trie树的节点,包括其子节点、该节点是否为结束节点、以及该节点对应的字符串数量。Trie
表示Trie树的主类,其中insert
方法用于插入一个字符串,count_prefix
方法用于计算具有给定前缀的字符串数量。在insert
方法中,我们沿着字符串的所有字符构建一条从根节点到相应字符串结束节点的路径,在遍历过程中相应节点的count
属性会加1。在count_prefix
方法中,我们沿着前缀构建从根节点到相应结尾节点的路径,并返回相应结尾节点的count
属性值即可。
本文介绍了如何使用Trie树计算具有给定前缀的字符串数量,通过实现Trie
类并使用insert
和count_prefix
方法即可实现该功能。Trie树作为一种高效的字符串数据结构,在多个场景下都有广泛的应用。