class TrieNode: def __init__(self): self.children = {} self.end_of_word = False class Trie: def __init__(self): self.root = TrieNode() def insert(self, word): node = self.root for char in word: if char not in node.children: node.children[char] = TrieNode() node = node.children[char] node.end_of_word = True def _dfs(self, node, prefix, results): if node.end_of_word: results.append(prefix) for char, child_node in node.children.items(): self._dfs(child_node, prefix + char, results) def starts_with(self, prefix): node = self.root for char in prefix: if char not in node.children: return [] node = node.children[char] results = [] self._dfs(node, prefix, results) return results trie = Trie() words = ["apple", "app", "application", "bat", "batch", "batman"] for w in words: trie.insert(w) print(trie.starts_with("app"))
The Trie stores all words. The starts_with method finds the node matching the prefix and collects all words below it. Words starting with 'app' are 'app', 'apple', and 'application'.
Trie stores characters in a tree structure allowing prefix search by following nodes. Hash Map stores keys but does not support efficient prefix queries without extra processing.
words = ["dog", "deer", "deal"] prefix_map = {} for word in words: for i in range(1, len(word)+1): prefix = word[:i] if prefix not in prefix_map: prefix_map[prefix] = [] prefix_map[prefix].append(word) print(prefix_map.get("de", []))
The code stores all prefixes as keys and lists of words as values. The prefix 'de' matches 'deer' and 'deal'.
starts_with('ca')?class TrieNode: def __init__(self): self.children = {} self.end_of_word = False class Trie: def __init__(self): self.root = TrieNode() def insert(self, word): node = self.root for char in word: node = node.children.setdefault(char, TrieNode()) node.end_of_word = True def starts_with(self, prefix): node = self.root for char in prefix: if char not in node.children: return [] node = node.children[char] return [prefix] trie = Trie() trie.insert("cat") trie.insert("car") print(trie.starts_with("ca"))
The insert method updates node incorrectly because setdefault returns the child node but the loop does not assign it properly, causing node to become None after first iteration.
Trie nodes share common prefixes, reducing memory by avoiding duplicate storage. Hash Map stores each prefix as a separate key, increasing memory usage.
