What if you could find all words starting with 'Sam' instantly, no matter how big the list?
Why Prefix Search Using Trie in DSA Javascript?
Imagine you have a huge phone book and you want to find all contacts starting with 'Sam'. You try to look through every name one by one, which takes forever.
Searching manually means checking each name from start to end. This is slow and tiring, especially if the list is very long. You might miss some names or get frustrated.
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 single name.
function searchPrefix(words, prefix) {
let results = [];
for (let word of words) {
if (word.startsWith(prefix)) results.push(word);
}
return results;
}class TrieNode { constructor() { this.children = {}; this.isEnd = false; } } class Trie { constructor() { this.root = new TrieNode(); } // insert and prefix search methods here }
It makes finding all words with a given start lightning fast, even in huge collections.
Search engines use prefix search to suggest words as you type, showing results instantly.
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 large data.
Practice
Solution
Step 1: Understand Trie usage
A Trie stores words in a tree-like structure where each node represents a character.Step 2: Identify prefix search benefit
This structure allows quick traversal to find all words sharing a prefix without scanning all words.Final Answer:
To efficiently find all words starting with a given prefix -> Option AQuick Check:
Trie = prefix search efficiency [OK]
- Confusing Trie with sorting algorithms
- Thinking Trie stores numbers only
- Assuming Trie is for arithmetic
Solution
Step 1: Understand Trie node structure
A Trie node typically has a children object to hold next characters and a boolean to mark word end.Step 2: Match correct initialization
const node = { children: {}, isEnd: false }; correctly creates an object with children as empty object and isEnd as false.Final Answer:
const node = { children: {}, isEnd: false }; -> Option DQuick Check:
Trie node = object with children and isEnd [OK]
- Using array instead of object for children
- Setting node to null instead of object
- Using Map without isEnd flag
class TrieNode {
constructor() {
this.children = {};
this.isEnd = false;
}
}
class Trie {
constructor() {
this.root = new TrieNode();
}
insert(word) {
let node = this.root;
for (const char of word) {
if (!node.children[char]) {
node.children[char] = new TrieNode();
}
node = node.children[char];
}
node.isEnd = true;
}
startsWith(prefix) {
let node = this.root;
for (const char of prefix) {
if (!node.children[char]) return false;
node = node.children[char];
}
return true;
}
}
const trie = new Trie();
trie.insert('cat');
trie.insert('car');
trie.insert('dog');
console.log(trie.startsWith('ca'));Solution
Step 1: Insert words into Trie
Words 'cat', 'car', and 'dog' are inserted, creating nodes for each character.Step 2: Check prefix 'ca'
Both 'cat' and 'car' start with 'ca', so traversal finds nodes for 'c' and 'a'.Final Answer:
true -> Option AQuick Check:
Prefix 'ca' exists = true [OK]
- Confusing startsWith with exact word search
- Expecting false if prefix is partial
- Ignoring that multiple words share prefix
insert(word) {
let node = this.root;
for (const char of word) {
if (node.children[char]) {
node.children[char] = new TrieNode();
}
node = node.children[char];
}
node.isEnd = true;
}Solution
Step 1: Analyze insert method logic
The code creates a new node only if node.children[char] exists, which is incorrect.Step 2: Correct condition for node creation
We should create a new node only if node.children[char] does NOT exist to avoid overwriting existing nodes.Final Answer:
Change if condition to check if child does NOT exist before creating new node -> Option BQuick Check:
Insert new node only if missing [OK]
- Creating new node when child already exists
- Forgetting to mark end of word
- Initializing node incorrectly
Solution
Step 1: Build Trie with all words
Insert all words so the Trie contains complete data for prefix search.Step 2: Traverse Trie for prefix 'ap'
Navigate nodes for 'a' then 'p', then collect all words from this subtree.Step 3: Collect descendant words
Gather words like 'apple', 'app', and 'apricot' that share the prefix.Final Answer:
Insert all words into Trie, then traverse nodes for prefix 'ap' and collect all descendant words -> Option CQuick Check:
Trie + prefix traversal = all matching words [OK]
- Filtering list without Trie defeats purpose
- Ignoring words not starting with prefix during insertion
- Using hash map instead of Trie for prefix search
Ready to prove it?
Pass the test and this pattern moves unknown
