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
posted @ 2020-12-07 15:15  童年の波鞋  阅读(104)  评论(0编辑  收藏  举报