📅  最后修改于: 2023-12-03 14:58:01.739000             🧑  作者: Mango
特里(Trie)是一种多叉树结构,主要用于字符串的存储和搜索。特里的每个节点代表一个字符,从根节点开始,到叶子节点的路径上的字符连接起来就组成了一个字符串。
在特里中搜索一个字符串,可以使用递归算法。具体实现方式如下:
class TrieNode:
def __init__(self):
self.children = {}
self.end_of_word = False
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word):
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.end_of_word = True
def search(self, word):
node = self.root
for char in word:
if char not in node.children:
return False
node = node.children[char]
return node.end_of_word
def starts_with(self, prefix):
node = self.root
for char in prefix:
if char not in node.children:
return False
node = node.children[char]
return True
def recursive_search(self, word):
if not word:
return self.root.end_of_word
node = self.root
for i, char in enumerate(word):
if char not in node.children:
return False
node = node.children[char]
if node.end_of_word:
if self.recursive_search(word[i+1:]):
return True
return False
TrieNode
类表示特里的节点,它有两个属性:children
和end_of_word
。children
是一个字典,存储着当前节点的子节点,end_of_word
表示当前节点是否是一个单词的结尾。Trie
类表示特里,它有一个属性root
,表示特里的根节点。它有三个方法:insert
、search
和starts_with
,分别用于插入一个单词、搜索一个单词和搜索以某个前缀开头的单词。recursive_search
方法是递归搜索算法的实现。它接受一个字符串参数word
,表示待搜索的单词。如果word
为空,则检查当前节点是否是一个单词的结尾,如果是,则返回True
,否则返回False
。否则,遍历word
中的每个字符,如果当前字符不在当前节点的子节点中,则返回False
。否则,移动到当前字符的子节点,如果当前节点是一个单词的结尾,则递归搜索剩余的字符,如果返回True
,则表示找到了一个单词,直接返回True
。如果遍历完word
后没有找到一个单词的结尾,则返回False
。trie = Trie()
trie.insert("apple")
trie.insert("banana")
trie.insert("pear")
assert trie.recursive_search("apple") == True
assert trie.recursive_search("banana") == True
assert trie.recursive_search("pear") == True
assert trie.recursive_search("apples") == False
assert trie.recursive_search("ban") == False
assert trie.recursive_search("peach") == False