Discover how a simple tree can make searching words lightning fast!
Why Prefix Search Using Trie in DSA Typescript?
Imagine you have a huge phone book and you want to find all contacts starting with "Sam". You flip pages one by one, checking each name carefully.
This manual search is slow and tiring. You waste time checking every name, even those that don't start with "Sam". It's easy to miss some or get tired and make mistakes.
A Trie is like a smart tree that organizes words by their letters. It lets you jump straight to all names starting with "Sam" without checking every entry. This saves time and effort.
function searchPrefix(words: string[], prefix: string): string[] {
const result: string[] = [];
for (const word of words) {
if (word.startsWith(prefix)) result.push(word);
}
return result;
}class TrieNode { children: Map<string, TrieNode> = new Map(); isEndOfWord: boolean = false; } class Trie { root = new TrieNode(); // insert and prefix search methods here }
It enables lightning-fast searches for all words sharing the same beginning letters, even in huge collections.
When you type in a search bar on your phone, the suggestions appear instantly because the system uses a Trie to find words starting with what you typed.
Manual search checks every word, which is slow.
Trie organizes words by letters for quick prefix lookup.
Prefix search with Trie is fast and efficient for autocomplete.
Practice
Solution
Step 1: Understand Trie usage
A Trie stores words by their prefixes, allowing quick prefix-based lookups.Step 2: Identify prefix search goal
Prefix search means finding all words starting with a given prefix efficiently.Final Answer:
To efficiently find all words that start with a given prefix -> Option AQuick Check:
Trie = Prefix search [OK]
- Confusing Trie with sorting structure
- Thinking Trie stores words reversed
- Assuming Trie counts total words only
Solution
Step 1: Check children type
Children should be a Map with string keys and TrieNode values for prefix characters.Step 2: Check endOfWord type
endOfWord is a boolean indicating if node ends a word.Final Answer:
class TrieNode { children: Map; endOfWord: boolean; constructor() { this.children = new Map(); this.endOfWord = false; } } -> Option DQuick Check:
Map + boolean endOfWord = class TrieNode { children: Map; endOfWord: boolean; constructor() { this.children = new Map(); this.endOfWord = false; } } [OK]
- Using array instead of Map for children
- Using wrong key type in Map
- Setting endOfWord as string instead of boolean
console.log(trie.startsWith('app'))?
class TrieNode {
children = new Map();
endOfWord = false;
}
class Trie {
root = new TrieNode();
insert(word: string) {
let node = this.root;
for (const char of word) {
if (!node.children.has(char)) {
node.children.set(char, new TrieNode());
}
node = node.children.get(char)!;
}
node.endOfWord = true;
}
startsWith(prefix: string): boolean {
let node = this.root;
for (const char of prefix) {
if (!node.children.has(char)) return false;
node = node.children.get(char)!;
}
return true;
}
}
const trie = new Trie();
trie.insert('apple');
trie.insert('app');
trie.insert('bat');Solution
Step 1: Insert words into Trie
Words 'apple', 'app', and 'bat' are inserted, so prefix 'app' exists in Trie.Step 2: Check startsWith method
Method returns true if prefix characters exist in Trie nodes, which they do for 'app'.Final Answer:
true -> Option AQuick Check:
Prefix 'app' found = true [OK]
- Confusing startsWith with search for whole word
- Expecting false if prefix is a word itself
- Thinking startsWith returns endOfWord status
startsWith method for a Trie but always returns false. What is the bug?
startsWith(prefix: string): boolean {
let node = this.root;
for (const char of prefix) {
if (!node.children.has(char)) return false;
node = node.children.get(char);
}
return false;
}Solution
Step 1: Analyze loop behavior
The loop correctly traverses nodes for each prefix character.Step 2: Check return statement
Method returns false always after loop, so never returns true even if prefix found.Step 3: Fix return logic
Return true after loop if all prefix chars found.Final Answer:
It should return true after the loop if prefix exists -> Option CQuick Check:
Return true after loop if prefix found [OK]
- Returning false at end regardless
- Checking endOfWord unnecessarily
- Incorrect node initialization
Solution
Step 1: Understand prefix search extension
To get all words with prefix, first find node matching prefix.Step 2: Collect words recursively
From prefix node, recursively traverse children to collect all complete words.Step 3: Evaluate other options
Filtering array or hash map is less efficient; reversed words search suffixes, not prefixes.Final Answer:
Traverse to prefix node, then recursively collect all words below. -> Option BQuick Check:
Recursive traversal from prefix node = Traverse to prefix node, then recursively collect all words below. [OK]
- Filtering all words each time (slow)
- Using hash map without prefix traversal
- Confusing prefix with suffix search
Ready to prove it?
Pass the test and this pattern moves unknown
