Bird
Raised Fist0
DSA Rustprogramming~20 mins

Trie Search Operation in DSA Rust - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Trie Search Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Searching a Word in a Trie
What is the output of the following Rust code that inserts words into a Trie and searches for a specific word?
DSA Rust
use std::collections::HashMap;

struct TrieNode {
    children: HashMap<char, TrieNode>,
    is_end_of_word: bool,
}

impl TrieNode {
    fn new() -> Self {
        TrieNode {
            children: HashMap::new(),
            is_end_of_word: false,
        }
    }
}

struct Trie {
    root: TrieNode,
}

impl Trie {
    fn new() -> Self {
        Trie {
            root: TrieNode::new(),
        }
    }

    fn insert(&mut self, word: &str) {
        let mut node = &mut self.root;
        for ch in word.chars() {
            node = node.children.entry(ch).or_insert(TrieNode::new());
        }
        node.is_end_of_word = true;
    }

    fn search(&self, word: &str) -> bool {
        let mut node = &self.root;
        for ch in word.chars() {
            match node.children.get(&ch) {
                Some(next_node) => node = next_node,
                None => return false,
            }
        }
        node.is_end_of_word
    }
}

fn main() {
    let mut trie = Trie::new();
    trie.insert("cat");
    trie.insert("car");
    trie.insert("dog");
    println!("{}", trie.search("car"));
}
ACompilation error
Bfalse
Ctrue
DRuntime panic
Attempts:
2 left
💡 Hint
Think about whether the word 'car' was inserted before searching.
❓ Predict Output
intermediate
2:00remaining
Search Result for a Non-Inserted Word
What will be printed when searching for the word "cap" in the following Trie after inserting "cat" and "car"?
DSA Rust
use std::collections::HashMap;

struct TrieNode {
    children: HashMap<char, TrieNode>,
    is_end_of_word: bool,
}

impl TrieNode {
    fn new() -> Self {
        TrieNode {
            children: HashMap::new(),
            is_end_of_word: false,
        }
    }
}

struct Trie {
    root: TrieNode,
}

impl Trie {
    fn new() -> Self {
        Trie {
            root: TrieNode::new(),
        }
    }

    fn insert(&mut self, word: &str) {
        let mut node = &mut self.root;
        for ch in word.chars() {
            node = node.children.entry(ch).or_insert(TrieNode::new());
        }
        node.is_end_of_word = true;
    }

    fn search(&self, word: &str) -> bool {
        let mut node = &self.root;
        for ch in word.chars() {
            match node.children.get(&ch) {
                Some(next_node) => node = next_node,
                None => return false,
            }
        }
        node.is_end_of_word
    }
}

fn main() {
    let mut trie = Trie::new();
    trie.insert("cat");
    trie.insert("car");
    println!("{}", trie.search("cap"));
}
Atrue
Bfalse
CCompilation error
DRuntime panic
Attempts:
2 left
💡 Hint
Check if "cap" was inserted or not.
🔧 Debug
advanced
2:00remaining
Identify the Bug in Trie Search Method
The following Rust code attempts to search a word in a Trie but always returns false. What is the bug?
DSA Rust
use std::collections::HashMap;

struct TrieNode {
    children: HashMap<char, TrieNode>,
    is_end_of_word: bool,
}

impl TrieNode {
    fn new() -> Self {
        TrieNode {
            children: HashMap::new(),
            is_end_of_word: false,
        }
    }
}

struct Trie {
    root: TrieNode,
}

impl Trie {
    fn new() -> Self {
        Trie {
            root: TrieNode::new(),
        }
    }

    fn insert(&mut self, word: &str) {
        let mut node = &mut self.root;
        for ch in word.chars() {
            node = node.children.entry(ch).or_insert(TrieNode::new());
        }
        node.is_end_of_word = true;
    }

    fn search(&self, word: &str) -> bool {
        let mut node = &self.root;
        for ch in word.chars() {
            if node.children.contains_key(&ch) {
                node = node.children.get(&ch).unwrap();
            } else {
                return false;
            }
        }
        false
    }
}

fn main() {
    let mut trie = Trie::new();
    trie.insert("hello");
    println!("{}", trie.search("hello"));
}
AThe search method always returns false at the end instead of checking is_end_of_word
BThe insert method does not mark the end of word correctly
CThe children HashMap is not initialized properly
DThe search method uses contains_key instead of get
Attempts:
2 left
💡 Hint
Look at the return statement after the loop in search.
🧠 Conceptual
advanced
1:30remaining
Understanding Trie Search Complexity
What is the time complexity of searching a word of length n in a Trie containing m words?
AO(n), where n is the length of the word being searched
BO(log m), logarithmic in number of words
CO(n * m), product of word length and number of words
DO(m), where m is the number of words in the Trie
Attempts:
2 left
💡 Hint
Consider how many characters you check during search.
🚀 Application
expert
2:30remaining
Result of Searching Prefix vs Whole Word in Trie
Given a Trie with words "apple", "app", and "application" inserted, what will be the output of searching for "app" and "appl" respectively?
A{"app": true, "appl": true}
B{"app": false, "appl": false}
C{"app": false, "appl": true}
D{"app": true, "appl": false}
Attempts:
2 left
💡 Hint
Remember that search returns true only if the exact word was inserted, not just a prefix.

Practice

(1/5)
1. What does the search operation in a Trie data structure do?
easy
A. Counts the total words stored in the Trie
B. Inserts a new word into the Trie
C. Checks if a given word exists in the Trie
D. Deletes a word from the Trie

Solution

  1. Step 1: Understand the purpose of search in Trie

    The search operation is designed to check if a specific word is present in the Trie structure.
  2. Step 2: Differentiate from other operations

    Insertion adds words, deletion removes words, and counting totals words, but search only checks existence.
  3. Final Answer:

    Checks if a given word exists in the Trie -> Option C
  4. Quick Check:

    Search = Check existence [OK]
Hint: Search checks presence, not insertion or deletion [OK]
Common Mistakes:
  • Confusing search with insert operation
  • Thinking search deletes words
  • Assuming search counts words
2. Which of the following is the correct Rust function signature for a Trie search method that returns a boolean?
easy
A. fn search(&self, word: &str) -> bool
B. fn search(word: String) -> bool
C. fn search(&mut self, word: &str) -> String
D. fn search(&self, word: &str) -> usize

Solution

  1. Step 1: Identify correct method receiver and parameters

    The search method should borrow self immutably (&self) and take a string slice (&str) for the word to search.
  2. Step 2: Confirm return type

    Search returns a boolean indicating presence, so return type must be bool.
  3. Final Answer:

    fn search(&self, word: &str) -> bool -> Option A
  4. Quick Check:

    Immutable borrow + &str + bool return [OK]
Hint: Search uses &self and returns bool [OK]
Common Mistakes:
  • Using mutable borrow &mut self unnecessarily
  • Returning wrong type like String or usize
  • Taking owned String instead of &str
3. Given the following Rust Trie search code snippet, what will be the output when searching for "cat"?
let mut trie = Trie::new();
trie.insert("car");
trie.insert("cat");
trie.insert("cap");
println!("{}", trie.search("cat"));
medium
A. Compilation error
B. false
C. panic at runtime
D. true

Solution

  1. Step 1: Analyze inserted words

    The words "car", "cat", and "cap" are inserted into the Trie, so "cat" is present.
  2. Step 2: Check search output for "cat"

    Searching "cat" should return true because it was inserted.
  3. Final Answer:

    true -> Option D
  4. Quick Check:

    Inserted words include "cat" so search returns true [OK]
Hint: Search returns true if word was inserted [OK]
Common Mistakes:
  • Assuming search returns false if similar words exist
  • Confusing insert and search methods
  • Expecting runtime errors without reason
4. Identify the bug in this Rust Trie search method snippet:
fn search(&self, word: &str) -> bool {
    let mut node = &self.root;
    for ch in word.chars() {
        if !node.children.contains_key(&ch) {
            return false;
        }
        node = node.children.get(&ch).unwrap();
    }
    true
}
medium
A. Uses unwrap() which causes panic always
B. Returns true even if word is a prefix but not complete word
C. Does not iterate over characters correctly
D. Incorrect return type

Solution

  1. Step 1: Understand search logic

    The code checks if each character exists in children nodes, moving down the Trie.
  2. Step 2: Check final return condition

    It returns true after loop without verifying if current node marks end of a complete word.
  3. Step 3: Identify bug

    This causes search to return true for prefixes that are not full words.
  4. Final Answer:

    Returns true even if word is a prefix but not complete word -> Option B
  5. Quick Check:

    Missing end-of-word check causes false positives [OK]
Hint: Check end-of-word flag after traversal [OK]
Common Mistakes:
  • Ignoring end-of-word marker in search
  • Assuming unwrap() always panics here
  • Misunderstanding iteration over chars
5. You want to modify a Trie search operation in Rust to support searching with wildcard character '.' which can match any single letter. Which approach is best to implement this feature?
hard
A. Use recursion to explore all children nodes when '.' is encountered
B. Replace '.' with all alphabets before searching iteratively
C. Ignore '.' and treat it as a normal character
D. Use a hash map to store wildcard positions and skip them

Solution

  1. Step 1: Understand wildcard '.' meaning

    The '.' can match any single character, so search must consider all possible children at that position.
  2. Step 2: Choose search strategy

    Recursion allows exploring all children nodes when '.' is found, checking all paths.
  3. Step 3: Evaluate other options

    Replacing '.' with all alphabets is inefficient; ignoring '.' is incorrect; hash map for positions doesn't solve matching.
  4. Final Answer:

    Use recursion to explore all children nodes when '.' is encountered -> Option A
  5. Quick Check:

    Recursion handles wildcards by branching [OK]
Hint: Use recursion to handle '.' wildcard in search [OK]
Common Mistakes:
  • Ignoring wildcard meaning
  • Trying to replace '.' with all letters before search
  • Skipping recursive exploration
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard