leetcode_208 Implement Trie (Prefix Tree)

题目描述

Implement a trie with insert, search, and startsWith methods.

Example:

Trie trie = new Trie();

trie.insert("apple");
trie.search("apple");   // returns true
trie.search("app");     // returns false
trie.startsWith("app"); // returns true
trie.insert("app");   
trie.search("app");     // returns true

Note:

You may assume that all inputs are consist of lowercase letters a-z.
All inputs are guaranteed to be non-empty strings.

思路分析

这个题,博主在讨论区找到一个神仙写法,故搬运至此

import collections
class Trie(object):

    def __init__(self):
        T = lambda: collections.defaultdict(T) 
        # 这里一行的 lambda 用的很牛逼,T 是一个函数
        # 这个函数的功能是构建一个字典,字典的默认值是函数本身
        self.root = T()
        # 对根节点做了初始化

    def insert(self, word):
        reduce(dict.__getitem__, word, self.root)['#'] = True
        # 这里用了 reduce 代替了 for 循环的工作,用了 dict 内置的 __getitem__ 方法
        # 以单词 air 为例,这个 reduce 最终找到了 self.root['a']['i']['r'] 然后赋值 '#'
        # 并且 self.root['a'] 中会有 self.root['a']['i']

    def search(self, word):
        return '#' in reduce(lambda cur, c: cur.get(c, {}), word, self.root)
		#查找的方式也是 reduce 进行的,如果没有被赋值为"#"则返回False

    def startsWith(self, prefix):
        return bool(reduce(lambda cur, c: cur.get(c, {}), prefix, self.root))
        #这一项则不需要判断'#'在不在,而只需要判断前缀的key是否是有值的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值