0
0
DSA Goprogramming~20 mins

Autocomplete System with Trie in DSA Go - Practice Problems & Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Trie Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of Trie Insertion and Search
What will be the output of the following Go code that inserts words into a Trie and searches for a prefix?
DSA Go
package main
import "fmt"

// TrieNode represents each node in the Trie
type TrieNode struct {
    children map[rune]*TrieNode
    isEnd bool
}

// Trie structure
type Trie struct {
    root *TrieNode
}

// Initialize a new TrieNode
func NewTrieNode() *TrieNode {
    return &TrieNode{children: make(map[rune]*TrieNode)}
}

// Initialize a new Trie
func NewTrie() *Trie {
    return &Trie{root: NewTrieNode()}
}

// Insert a word into the Trie
func (t *Trie) Insert(word string) {
    node := t.root
    for _, ch := range word {
        if _, ok := node.children[ch]; !ok {
            node.children[ch] = NewTrieNode()
        }
        node = node.children[ch]
    }
    node.isEnd = true
}

// Search for a prefix in the Trie
func (t *Trie) StartsWith(prefix string) bool {
    node := t.root
    for _, ch := range prefix {
        if _, ok := node.children[ch]; !ok {
            return false
        }
        node = node.children[ch]
    }
    return true
}

func main() {
    trie := NewTrie()
    trie.Insert("dog")
    trie.Insert("deer")
    trie.Insert("deal")
    fmt.Println(trie.StartsWith("de"))
    fmt.Println(trie.StartsWith("do"))
    fmt.Println(trie.StartsWith("cat"))
}
A
false
true
false
B
true
false
false
C
true
true
false
D
false
false
true
Attempts:
2 left
💡 Hint
Think about how the Insert method builds the Trie and how StartsWith checks prefixes.
🧠 Conceptual
intermediate
1:30remaining
Understanding Trie Node Structure
Which of the following best describes the role of the 'isEnd' boolean in a Trie node?
AIt marks the node as the end of a complete word stored in the Trie.
BIt counts how many words pass through this node.
CIt stores the character value of the node.
DIt points to the parent node in the Trie.
Attempts:
2 left
💡 Hint
Think about how the Trie distinguishes between prefixes and complete words.
🔧 Debug
advanced
2:00remaining
Find the Bug in Trie Search Method
What error will the following Go code produce when searching for a prefix in a Trie?
DSA Go
func (t *Trie) StartsWith(prefix string) bool {
    node := t.root
    for _, ch := range prefix {
        if node.children[ch] == nil {
            return false
        }
        node = node.children[ch]
    }
    return node.isEnd
}
AIt returns false for prefixes that are valid but not complete words.
BIt returns true only if the prefix is a complete word, not just a prefix.
CIt always returns true regardless of prefix existence.
DIt causes a runtime panic due to nil map access.
Attempts:
2 left
💡 Hint
Check the return condition and what the method is supposed to do.
🚀 Application
advanced
2:30remaining
Autocomplete Suggestions Using Trie
Given a Trie with words inserted, which approach correctly collects all words starting with a given prefix?
AOnly return the prefix itself if it is a complete word.
BTraverse the entire Trie and collect words containing the prefix anywhere.
CReturn all words inserted without filtering by prefix.
DTraverse to the prefix node, then perform DFS collecting words where isEnd is true.
Attempts:
2 left
💡 Hint
Think about how to efficiently find all words starting with a prefix in a Trie.
Predict Output
expert
3:00remaining
Output of Trie Autocomplete Function
What is the output of the following Go code that performs autocomplete suggestions for prefix "ca"?
DSA Go
package main
import "fmt"

// TrieNode and Trie definitions omitted for brevity
// Assume Insert and StartsWith methods exist as before

func (t *Trie) collectWords(node *TrieNode, prefix string, results *[]string) {
    if node.isEnd {
        *results = append(*results, prefix)
    }
    for ch, child := range node.children {
        t.collectWords(child, prefix+string(ch), results)
    }
}

func (t *Trie) Autocomplete(prefix string) []string {
    node := t.root
    for _, ch := range prefix {
        if _, ok := node.children[ch]; !ok {
            return []string{}
        }
        node = node.children[ch]
    }
    var results []string
    t.collectWords(node, prefix, &results)
    return results
}

func main() {
    trie := NewTrie()
    trie.Insert("cat")
    trie.Insert("car")
    trie.Insert("cart")
    trie.Insert("dog")
    trie.Insert("dove")
    suggestions := trie.Autocomplete("ca")
    fmt.Println(suggestions)
}
A["cat", "car", "cart"]
B["cat", "car"]
C["car", "cart"]
D["dog", "dove"]
Attempts:
2 left
💡 Hint
Check which words start with "ca" and how collectWords gathers them.