题目难度: 中等
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复
剑指offer2
就能看到该系列当前连载的所有文章了, 记得关注哦~
Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // 返回 True
trie.search("app"); // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app"); // 返回 True
class Node:
def __init__(self):
# {字符->子节点}字典
self.children = {}
# boolean flag判断当前节点结尾时是否构成单词
self.isWord = False
class Trie:
def __init__(self):
"""
Initialize your data structure here.
"""
# 保存根节点
self.root = Node()
def insert(self, word: str) -> None:
"""
Inserts a word into the trie.
"""
# 初始化为根节点
cur = self.root
for c in word:
if c not in cur.children:
# 子节点不存在时创建它
cur.children[c] = Node()
cur = cur.children[c]
# 根节点->最终节点的路径形成了完整的单词
cur.isWord = True
def find(self, word: str) -> Node:
cur = self.root
for c in word:
if c not in cur.children:
# 子节点不存在时返回空
return None
cur = cur.children[c]
# 返回最终节点
return cur
def search(self, word: str) -> bool:
"""
Returns if the word is in the trie.
"""
last_node = self.find(word)
# 最终节点不为空且形成单词时才返回true
return last_node is not None and last_node.isWord
def startsWith(self, prefix: str) -> bool:
"""
Returns if there is any word in the trie that starts with the given prefix.
"""
# 最终节点不为空时返回true
return self.find(prefix) is not None
大家可以在下面这些地方找到我~😊
我的公众号: 算法精选, 欢迎大家扫码关注~😊