208. 实现 Trie (前缀树)

class TreeNode:
    def __init__(self):
        self.children = defaultdict(TreeNode)
        self.is_end=False 
    


class Trie:

    def __init__(self):
        self.root = TreeNode()

    def insert(self, word: str) -> None:
        cur =self.root
        for i in word :
            if i not in cur.children:
                cur.children[i]=TreeNode()
            cur=cur.children[i]
        cur.is_end= True
    def search(self, word: str) -> bool:
        cur =self.root
        for i in word :
            if i not in cur.children:
                return False 
            cur=cur.children[i]
        return cur.is_end

    def startsWith(self, prefix: str) -> bool:
        cur =self.root
        for i in prefix :
            if i not in cur.children:
                return False 
            cur=cur.children[i]
        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)
from collections import defaultdict # 导入 defaultdict

class TrieNode:
    """Trie (前缀树) 的节点"""
    def __init__(self):
        # 使用 defaultdict 来存储子节点。
        # defaultdict 的参数是 TrieNode 类本身。
        # 当我们尝试访问一个不存在的字符键时,
        # 它会自动调用 TrieNode() 来创建一个新的子节点,
        # 并将其与该字符关联起来。
        self.children = defaultdict(TrieNode)
        # 标记当前节点是否是一个完整单词的结尾
        self.is_end = False

# --- 如何在 Trie 类中使用这个 TrieNode ---

class Trie:
    def __init__(self):
        """
        初始化前缀树对象。
        只需要创建一个根节点即可。
        """
        self.root = TrieNode() # 根节点本身不代表任何字符

    def insert(self, word: str) -> None:
        """
        向前缀树中插入字符串 word。
        """
        current_node = self.root
        # 遍历单词中的每个字符
        for char in word:
            # 移动到下一个节点。
            # 如果 char 对应的子节点不存在,defaultdict 会自动创建新的 TrieNode。
            current_node = current_node.children[char]
        # 单词遍历结束后,将最后一个字符对应的节点的 is_end 标记为 True
        current_node.is_end = True

    def search(self, word: str) -> bool:
        """
        如果字符串 word 在前缀树中 (作为一个完整的单词存在),返回 true;否则,返回 false。
        """
        current_node = self.root
        for char in word:
            # 如果路径中某个字符不存在于子节点中
            if char not in current_node.children:
                return False # 单词肯定不存在
            # 移动到下一个节点
            current_node = current_node.children[char]
        # 单词遍历结束后,必须检查最后一个节点的 is_end 标记是否为 True
        return current_node.is_end

    def startsWith(self, prefix: str) -> bool:
        """
        如果之前已经插入的字符串 word 的前缀之一为 prefix,返回 true;否则,返回 false。
        """
        current_node = self.root
        for char in prefix:
            # 如果路径中某个字符不存在于子节点中
            if char not in current_node.children:
                return False # 前缀不存在
            # 移动到下一个节点
            current_node = current_node.children[char]
        # 只要前缀的所有字符都能在树中找到路径,就返回 True
        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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值