54.实现Trie(前缀和)
class Trie:# 定义26叉树的节点类class TrieNode:def __init__(self):self.son = [None] * 26 # 存储26个子节点(对应a-z)self.end = False # 标记是否为单词结尾def __init__(self):"""初始化前缀树,根节点为空白节点"""self.root = self.TrieNode()def find(self, word):"""辅助函数:查找字符串在树中的状态返回值:0(未找到)、1(找到但不是结尾)、2(找到且是结尾)"""cur = self.root # 从根节点开始遍历for c in word:# 计算字符对应的索引(a→0, b→1, ..., z→25)idx = ord(c) - ord('a')# 若当前字符不在子节点中,返回0(未找到)if not cur.son[idx]:return 0# 移动到子节点继续遍历cur = cur.son[idx]# 遍历结束:根据end判断是结尾(2)还是仅前缀(1)return 2 if cur.end else 1def insert(self, word):"""向前缀树插入字符串word"""cur = self.rootfor c in word:idx = ord(c) - ord('a')# 若子节点不存在,创建新节点if not cur.son[idx]:cur.son[idx] = self.TrieNode()# 移动到子节点cur = cur.son[idx]# 标记当前节点为单词结尾cur.end = Truedef search(self, word):"""判断word是否是前缀树中的完整单词"""# 仅当find返回2(找到且是结尾)时返回Truereturn self.find(word) == 2def startsWith(self, prefix):"""判断是否存在以prefix为前缀的单词"""# 只要find返回非0(找到,无论是否结尾)就返回Truereturn self.find(prefix) != 0