b_nk_实现Trie树(用数组记录孩子结点)
实现一个 Trie (前缀树),包含 insert, delete, isExist, 和 prefixCount 这四个操作。
class Node:
def __init__(self, val) -> None:
self.child=[None for i in range(26)]
self.isEnd=False
self.val=val
self.cnt=0 #以结点val为尾巴的路径数
class Trie:
def __init__(self) -> None:
self.root=Node('/')
"""
添加word
"""
def insert(self, word: str) -> None:
cur=self.root
for c in word:
u=ord(c)-ord('a')
if not cur.child[u]:
cur.child[u]=Node(c)
cur=cur.child[u]
cur.cnt+=1
cur.isEnd=True
"""
删除word
"""
def delete(self, word: str) -> None:
cur=self.root
for c in word:
u=ord(c)-ord('a')
if not cur.child[u] or cur.child[u].cnt==0:
cur.child[u]=None
return
cur.child[u].cnt-=1
cur=cur.child[u]
cur.isEnd=False
"""
查询word是否在字典树中
"""
def isExist(self, word: str) -> str:
cur=self.root
for c in word:
u=ord(c)-ord('a')
if not cur.child[u]:
return "NO"
cur=cur.child[u]
return "YES" if cur.isEnd else "NO"
"""
返回以word为前缀的单词数量
"""
def prefixCount(self, word: str) -> int:
cur=self.root
for c in word:
u=ord(c)-ord('a')
if not cur.child[u]: return 0
cur=cur.child[u]
return cur.cnt
class Solution:
def trieU(self , ops ):
trie,ans=Trie(),[]
for op in ops:
if op[0]=="1": #添加
trie.insert(op[1])
elif op[0]=="2": #删除
trie.delete(op[1])
elif op[0]=="3": #查询是否存在
ans.append(trie.isExist(op[1]))
else: #返回以op[1]开头的单词的数量
ans.append(str(trie.prefixCount(op[1])))
return ans