题目描述
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是否是有值的