A Trie is a tree-like data structure that stores a dynamic set of strings, where each node represents a character. It is used to efficiently search for words with common prefixes.
Click to reveal answer
beginner
How does a Trie help in implementing autocomplete?
A Trie allows quick lookup of all words that start with a given prefix by traversing nodes matching the prefix and then collecting all descendant words.
Click to reveal answer
intermediate
What is the time complexity to insert a word of length n into a Trie?
The time complexity is O(n), where n is the length of the word, because each character is inserted one by one along the path in the Trie.
Click to reveal answer
intermediate
In an autocomplete system using Trie, what is the main step after reaching the node of the prefix?
After reaching the node representing the last character of the prefix, the system performs a traversal (like DFS) to collect all words that start with that prefix.
Click to reveal answer
intermediate
Why is Trie preferred over a hash map for autocomplete?
Trie is preferred because it stores words in a prefix-shared way, allowing efficient prefix searches and retrieval of all words with a given prefix, which hash maps do not support directly.
Click to reveal answer
What does each node in a Trie represent?
AA character
BA whole word
CA number
DA sentence
✗ Incorrect
Each node in a Trie represents a single character of a word.
What is the first step in autocomplete using a Trie?
ASort all words alphabetically
BInsert all words again
CDelete the prefix
DTraverse the Trie to the prefix node
✗ Incorrect
First, we traverse the Trie to reach the node representing the last character of the prefix.
Which traversal method is commonly used to collect autocomplete suggestions after prefix node?
ADepth-First Search (DFS)
BBreadth-First Search (BFS)
CBinary Search
DLinear Search
✗ Incorrect
DFS is commonly used to explore all descendant nodes to collect words starting with the prefix.
What is the space complexity concern with Tries?
AThey store only one word
BThey can use a lot of memory due to many nodes
CThey use less memory than arrays
DThey compress all words into one node
✗ Incorrect
Tries can consume a lot of memory because each character is stored in a separate node, leading to many nodes.
Which of these is NOT a benefit of using Trie for autocomplete?
AFast prefix search
BEasy to find all words with a prefix
CEfficient memory usage for all languages
DInsertion time proportional to word length
✗ Incorrect
Tries may not be memory efficient for all languages or large alphabets, so B is not a benefit.
Explain how an autocomplete system works using a Trie data structure.
Think about how you find all words starting with a prefix.
You got /4 concepts.
Describe the steps to insert a word into a Trie and how it supports autocomplete.
Insertion builds the Trie; autocomplete uses prefix traversal.
You got /4 concepts.
Practice
(1/5)
1. What is the main advantage of using a Trie over a HashSet for implementing an autocomplete system?
easy
A. Trie uses less memory than HashSet for all cases
B. Trie supports prefix-based search efficiently, while HashSet requires checking all words
C. Trie is faster for exact word lookup than HashSet
D. Trie automatically sorts words alphabetically unlike HashSet
Solution
Step 1: Understand autocomplete requirement
Autocomplete needs to find all words that start with a given prefix quickly.
Step 2: Compare Trie vs HashSet
Trie stores characters level by level, so prefix traversal is O(prefix length). HashSet requires scanning all words to check which ones start with the prefix.
Final Answer:
Trie supports prefix-based search efficiently, while HashSet requires checking all words -> Option B
Quick Check:
Trie = prefix search in O(m), HashSet = O(n*m) for prefix [OK]
Hint: Trie shares common prefixes among words - natural fit for autocomplete [OK]
Common Mistakes:
Assuming Trie always uses less memory - it can use more for sparse word sets
Thinking exact lookup is why Trie beats HashSet - HashSet is actually faster for exact lookup
Assuming Trie sorts automatically - it doesn't sort, traversal order depends on children insertion
2. Which C# code correctly inserts a word into a Trie node structure where each node has a Dictionary<char, TrieNode> Children and a bool IsEndOfWord?
easy
A. node.Children[c] = new TrieNode(); node = node.Children[c];
B. if (!node.Children.ContainsKey(c)) node.Children[c] = new TrieNode(); node = node.Children[c];
C. node.Children.Add(c); node = node.Children[c];
D. node.Children[c] = c; node = node.Children[c];
Solution
Step 1: Check if child exists
Before creating a new node, check if the character key already exists in Children to avoid overwriting existing subtrees.
Step 2: Create only if missing
Using ContainsKey check ensures we reuse existing nodes and only create new ones when the character path doesn't exist yet.
Final Answer:
if (!node.Children.ContainsKey(c)) node.Children[c] = new TrieNode(); node = node.Children[c]; -> Option B
Quick Check:
Always check ContainsKey before adding to avoid overwriting existing paths [OK]
Hint: Always guard with ContainsKey before inserting a new Trie node [OK]
Common Mistakes:
Option A overwrites existing children, destroying previously inserted words
Option C uses Add which throws if key already exists
Option D stores char as value instead of TrieNode
3. What will the following C# Trie prefix search return when searching for prefix "ca" in a Trie containing ["cat", "car", "card", "dog"]?
List<string> results = new List<string>();
void DFS(TrieNode node, string current) {
if (node.IsEndOfWord) results.Add(current);
foreach (var kvp in node.Children)
DFS(kvp.Value, current + kvp.Key);
}
TrieNode prefixNode = GetPrefixNode("ca");
if (prefixNode != null) DFS(prefixNode, "ca");
medium
A. ["cat", "car", "card", "dog"]
B. ["ca"]
C. ["cat", "car", "card"]
D. []
Solution
Step 1: Find prefix node
GetPrefixNode("ca") traverses c→a and returns the node at 'a'. "dog" is unreachable from this node.
Step 2: DFS from prefix node
DFS explores all children from 'a': t (cat), r (car), r→d (card). All three have IsEndOfWord=true.
Final Answer:
["cat", "car", "card"] -> Option C
Quick Check:
Only words under prefix "ca" subtree are returned, "dog" excluded [OK]
Hint: DFS from prefix node returns only words in that subtree - "dog" is in a different branch [OK]
Common Mistakes:
Including 'dog' - it's in a completely separate Trie branch
Returning only 'ca' - 'ca' itself is not marked IsEndOfWord
Returning empty - prefix 'ca' exists in the Trie so DFS finds words
4. Identify the bug in this C# autocomplete prefix search:
bool StartsWith(string prefix) {
TrieNode node = root;
foreach (char c in prefix) {
if (!node.Children.ContainsKey(c))
return true;
node = node.Children[c];
}
return false;
}
medium
A. Should return false when character not found, and true at the end
B. Should use a List instead of Dictionary for Children
C. Should check IsEndOfWord instead of ContainsKey
D. Should start from the last character of the prefix
Solution
Step 1: Trace the logic
When a character is not found in Children, it means the prefix doesn't exist - should return false, not true. And after traversing all prefix characters successfully, the prefix exists - should return true.
Step 2: Identify the swap
The return values are swapped: 'return true' and 'return false' are in each other's place.
Final Answer:
Should return false when character not found, and true at the end -> Option A
Hint: If you can't follow the path, prefix is absent = false; if path complete = true [OK]
Common Mistakes:
Thinking Dictionary is wrong - Dictionary is correct for Children
Checking IsEndOfWord - StartsWith only checks if prefix path exists, not word end
Starting from last character - prefix traversal always goes left to right
5. In a Trie-based autocomplete system with 100,000 words averaging 8 characters each, what is the time complexity to retrieve all words matching a prefix of length p, where k is the number of matching words and m is the average word length?
hard
A. O(n) where n is total number of words
B. O(p + k * m) - traverse prefix then DFS over matching words
C. O(p * n) - check prefix against each word
D. O(1) - Trie provides constant time autocomplete
Solution
Step 1: Cost of reaching prefix node
Traversing p characters to reach the prefix node costs O(p).
Step 2: Cost of DFS to collect results
DFS visits all nodes under the prefix subtree. With k matching words of average length m, this costs O(k * m) in the worst case.