来自北大算法课的Leetcode题解:208. 实现Trie(前缀树)

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

  • 解法1(T76% S67%): 是数据结构设计的题。对于前缀树(字典树)中每个节点TrieNode保存的是children节点,可以通过一个字典实现,同时要设置一个flag标明当前节点是否为完整的单词,叶子节点保存的就是一个完整的单词但并不是所有单词都是叶

    • insert():把每个字母都当作一个节点挂在上一个节点的children中,如果children中已经有了这个字符那就不用创建了直接使用就可以
    • search():不断搜索children,如果最终停下来的flag是word,则证明找到了这个单词
    • startsWith():跟search逻辑一样,只是不需要满足停下来的时候是单词,只要之前一直满足children中有各个字符就可以

    为什么要设立flag标识是否为单词呢?比如第一次插入app,那一个左支树a-p-p;又插入apple,发现之前已经有a-p-p了,所以接着往后挂就可以a-p-p-l-e,但app也是一个单词,最后的p并不是叶节点

    def search(self, word: str) -> bool:
      node = self.root
      for c in word:
          if c not in node.children: return False
          node = node.children[c]
      return node.isWord
    
class TrieNode:
    def __init__(self):
        self.children = {}
        self.isWord = False

class Trie:

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


    def insert(self, word: str) -> None:
        node = self.root
        for c in word:
            if c not in node.children:
                node.children[c] = TrieNode()
            node = node.children[c]
        node.isWord = True


    def search(self, word: str) -> bool:
        node = self.root
        for c in word:
            if c not in node.children: return False
            node = node.children[c]
        return node.isWord


    def startsWith(self, prefix: str) -> bool:
        node = self.root
        for c in prefix:
            if c not in node.children: return False
            node = node.children[c]
        return True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值