• 感觉这个python版的代码比C版的代码好写多了

1.题目

【LeetCode】208.实现Trie(前缀树)_算法

2.分析

【LeetCode】208.实现Trie(前缀树)_算法_02


图中的每个圆圈都是下面代码中​​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)