Discover why your phone's autocomplete is fast and how Tries make it possible!
Why Trie Exists and What Hash Map Cannot Do for Strings in DSA Typescript - The Real Reason
Imagine you have a huge list of words and you want to find all words that start with a certain prefix, like 'app'. You try to check each word one by one to see if it starts with 'app'. This takes a lot of time and effort.
Manually checking each word or using a simple hash map to store words only helps you find exact matches. It cannot quickly find all words sharing the same beginning letters. This makes searching slow and complicated when you want to find words by prefix.
A Trie is like a tree where each branch represents a letter. It stores words so that common beginnings share the same path. This way, you can quickly find all words starting with a prefix by following the branches, without checking every word.
const words = ['apple', 'app', 'bat']; const prefix = 'app'; const result = words.filter(word => word.startsWith(prefix)); console.log(result);
class TrieNode { children: Map<string, TrieNode> = new Map(); isWord: boolean = false; } // Insert words and search prefix efficiently using Trie
It enables lightning-fast prefix searches and autocomplete features that simple hash maps cannot provide.
When you type in a search box on your phone, the suggestions appear instantly because a Trie helps find all words starting with what you typed so far.
Manual search or hash maps only find exact words, not prefixes.
Trie stores words by shared letters, making prefix search fast.
Tries power autocomplete and quick word lookup in many apps.
Practice
Solution
Step 1: Understand Trie and Hash Map capabilities
Trie stores strings in a tree form, allowing quick prefix searches. Hash Maps store keys but do not support prefix queries efficiently.Step 2: Compare use cases for prefix search
Trie can find all strings starting with a prefix quickly, which Hash Maps cannot do without scanning all keys.Final Answer:
Because Trie efficiently supports prefix-based searches and auto-completion -> Option DQuick Check:
Prefix search = Trie [OK]
- Thinking Hash Maps support prefix search efficiently
- Assuming Trie always uses less memory
- Believing Hash Maps cannot store strings as keys
Solution
Step 1: Understand Map type declaration in TypeScript
Map keys and values must be typed as Map. Here keys are characters (string), values are TrieNode.Step 2: Check each option's syntax
class TrieNode { children: Map = new Map(); } correctly declares children as Map initialized with new Map(). Others have wrong generic order or types.Final Answer:
class TrieNode { children: Map = new Map(); } -> Option AQuick Check:
Map syntax correct [OK]
- Swapping key and value types in Map
- Not initializing Map with new Map()
- Using wrong generic types for Map
class TrieNode {
children: Map = new Map();
isEnd: boolean = false;
}
class Trie {
root = new TrieNode();
insert(word: string) {
let node = this.root;
for (const ch of word) {
if (!node.children.has(ch)) {
node.children.set(ch, new TrieNode());
}
node = node.children.get(ch)!;
}
node.isEnd = true;
}
startsWith(prefix: string): boolean {
let node = this.root;
for (const ch of prefix) {
if (!node.children.has(ch)) return false;
node = node.children.get(ch)!;
}
return true;
}
}
const trie = new Trie();
['cat', 'car', 'dog'].forEach(w => trie.insert(w));
console.log(trie.startsWith('ca'));Solution
Step 1: Insert words into Trie
Words 'cat', 'car', and 'dog' are inserted. 'ca' prefix nodes are created for 'c' and 'a'.Step 2: Check startsWith for 'ca'
Traversal finds nodes for 'c' and 'a' successfully, so returns true.Final Answer:
true -> Option BQuick Check:
Prefix 'ca' exists = true [OK]
- Confusing startsWith with exact word search
- Assuming isEnd must be true for prefix check
- Expecting false if prefix is partial
search(word: string): boolean {
let node = this.root;
for (const ch of word) {
if (!node.children.has(ch)) return false;
node = node.children.get(ch)!;
}
return false;
}Solution
Step 1: Analyze the return statement after loop
The method returns false after the loop without checking if the last node marks end of a word.Step 2: Identify missing isEnd check
It should return node.isEnd to confirm full word presence, not just prefix.Final Answer:
It always returns false even if word exists -> Option AQuick Check:
Missing isEnd check causes always false [OK]
- Returning false without checking isEnd
- Confusing prefix search with full word search
- Ignoring empty string edge case
Solution
Step 1: Understand Trie prefix storage
Trie organizes words by shared prefixes in a tree, enabling quick retrieval of all words with a prefix.Step 2: Understand Hash Map limitations
Hash Map stores keys without order, so prefix search requires checking all keys, which is inefficient.Final Answer:
Trie stores words in a prefix tree allowing fast prefix queries; Hash Map can't efficiently find keys by prefix without scanning all keys. -> Option CQuick Check:
Prefix search efficiency = Trie advantage [OK]
- Thinking Hash Map supports prefix search efficiently
- Assuming Trie uses less memory always
- Confusing exact search with prefix search
Ready to prove it?
Pass the test and this pattern moves unknown
