【LeetCode】208.实现Trie(前缀树)
原创
©著作权归作者所有:来自51CTO博客作者说文科技的原创作品,请联系作者获取转载授权,否则将追究法律责任
1.题目

2.分析

图中的每个圆圈都是下面代码中Trie
类的一个实例,这个实例有两个属性,分别是
- isEnd:表示当前这个节点是否是叶子节点
- next:表示当前这个叶子节点的后序链表节点
通过一个链表的形式将插入的字符串链接起来。
3.代码
class Trie:
def __init__(self):
self.isEnd = False # 判断当前字符是否结尾字符
self.next = [None] * 26 # 用于接注后序的字符,存储的仍然是一个Trie节点
# 插入节点的时候,需要迭代更新这个节点参数
def insert(self, word: str) -> None:
root = self # 表示当前值
for i in range(len(word)):
cur = word[i] # 当前字符
idx = ord(cur) - ord('a') # 得到下标
if root.next[idx] is None: # 如果为None
new_node = Trie()
root.next[idx] = new_node #
root = new_node # 更新节点值
else:
root = root.next[idx]
root.isEnd = True
def search(self, word: str) -> bool:
root = self
for i in range(len(word)):
cur = word[i]
idx = ord(cur) - ord('a')
if root.next[idx]:
root = root.next[idx]
else:
return False
return root.isEnd
def startsWith(self, prefix: str) -> bool:
root = self
for i in range(len(prefix)):
cur = prefix[i]
idx = ord(cur) - ord('a')
if root.next[idx]:
root = root.next[idx]
else:
return False
return True
# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)