Trie

https://leetcode.com/problems/implement-trie-prefix-tree/

Implementation

Basic

class TrieNode:
    def __init__(self):
        self.children = {}
        self.is_end_of_word = False
 
class Trie:
    def __init__(self):
        self.root = TrieNode()
 
    def insert(self, word: str) -> None:
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_end_of_word = True
 
    def search(self, word: str) -> bool:
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.is_end_of_word
 
    def startsWith(self, prefix: str) -> bool:
        node = self.root
        for char in prefix:
            if char not in node.children:
                return False
            node = node.children[char]
        return True

Optimized

class Trie(dict):
    def insert(self, word: str) -> None:
        reduce(lambda node, c: node.setdefault(c, {}), word, self)['$'] = True
 
    def search(self, word: str) -> bool:
        return self.startsWith(word + '$')
 
    def startsWith(self, prefix: str) -> bool:
        node = self
        return all(node := node.get(char) for char in prefix)