Bird
Raised Fist0
DSA Rustprogramming~20 mins

Longest Word in Dictionary Using Trie in DSA Rust - Practice Problems & Challenges

Choose your learning style10 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 Longest Word Found Using Trie
What is the output of the following Rust code that builds a Trie from a list of words and finds the longest word where all prefixes are present?
DSA Rust
struct TrieNode {
    children: [Option<Box<TrieNode>>; 26],
    is_end: bool,
}

impl TrieNode {
    fn new() -> Self {
        Self {
            children: Default::default(),
            is_end: false,
        }
    }
}

struct Trie {
    root: TrieNode,
}

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

    fn insert(&mut self, word: &str) {
        let mut node = &mut self.root;
        for &b in word.as_bytes() {
            let idx = (b - b'a') as usize;
            if node.children[idx].is_none() {
                node.children[idx] = Some(Box::new(TrieNode::new()));
            }
            node = node.children[idx].as_mut().unwrap();
        }
        node.is_end = true;
    }

    fn longest_word(&self) -> String {
        let mut result = String::new();
        let mut path = Vec::new();
        self.dfs(&self.root, &mut path, &mut result);
        result
    }

    fn dfs(&self, node: &TrieNode, path: &mut Vec<u8>, result: &mut String) {
        if node != &self.root && !node.is_end {
            return;
        }
        if path.len() > result.len() {
            *result = String::from_utf8(path.clone()).unwrap();
        }
        for i in 0..26 {
            if let Some(child) = &node.children[i] {
                path.push(b'a' + i as u8);
                self.dfs(child, path, result);
                path.pop();
            }
        }
    }
}

fn main() {
    let words = vec!["w","wo","wor","worl","world"];
    let mut trie = Trie::new();
    for w in &words {
        trie.insert(w);
    }
    println!("{}", trie.longest_word());
}
A"wor"
B"world"
C"worl"
D"wo"
Attempts:
2 left
💡 Hint
Think about the longest word where all prefixes are also words in the list.
🧠 Conceptual
intermediate
1:30remaining
Understanding Trie Node Structure
In a Trie node implementation for lowercase English letters, why is an array of size 26 used for children nodes instead of other data structures?
ABecause it supports Unicode characters efficiently.
BBecause it uses less memory than a linked list of children nodes.
CBecause it automatically sorts the children nodes alphabetically.
DBecause it allows constant time access to each child node by character index.
Attempts:
2 left
💡 Hint
Think about how fast you can find a child node for a given character.
🔧 Debug
advanced
2:30remaining
Identify the Bug in Trie Longest Word Search
Given the following snippet from a Trie DFS function, what is the bug that causes incorrect longest word detection? fn dfs(&self, node: &TrieNode, path: &mut Vec, result: &mut String) { if node != &self.root && !node.is_end { return; } if path.len() >= result.len() { *result = String::from_utf8(path.clone()).unwrap(); } for i in 0..26 { if let Some(child) = &node.children[i] { path.push(b'a' + i as u8); self.dfs(child, path, result); path.pop(); } } }
AUsing '>=' instead of '>' causes lexicographically smaller words to overwrite longer ones.
BNot checking if node is root before returning causes infinite recursion.
CNot marking nodes as visited causes repeated visits and stack overflow.
DUsing 'path.clone()' causes ownership errors in Rust.
Attempts:
2 left
💡 Hint
Consider what happens when two words have the same length.
🚀 Application
advanced
2:00remaining
Longest Word with All Prefixes Present
Given a list of words, which approach best finds the longest word such that every prefix of the word is also in the list?
AInsert all words into a Trie, then DFS to find the longest word where each node is an end of a word.
BSort words by length descending and check prefixes using string slicing.
CUse a hash set to store words and check prefixes iteratively for each word.
DBuild a suffix tree and find the longest suffix with all prefixes.
Attempts:
2 left
💡 Hint
Think about a data structure that efficiently stores prefixes.
📝 Syntax
expert
2:30remaining
Correct Rust Syntax for Trie Children Initialization
Which option correctly initializes the children array in a Rust TrieNode struct for 26 lowercase letters?
DSA Rust
struct TrieNode {
    children: [Option<Box<TrieNode>>; 26],
    is_end: bool,
}

impl TrieNode {
    fn new() -> Self {
        Self {
            children: /* fill here */,
            is_end: false,
        }
    }
}
A[Option::None; 26]
Bvec![None; 26]
C[None; 26]
D[Box::new(None); 26]
Attempts:
2 left
💡 Hint
Think about fixed-size arrays and default values in Rust.

Practice

(1/5)
1. What is the main purpose of using a Trie data structure when finding the longest word in a dictionary?
easy
A. To reverse the words quickly
B. To sort words alphabetically
C. To count the total number of words
D. To efficiently store and search words by their prefixes

Solution

  1. Step 1: Understand Trie usage

    A Trie stores words by their prefixes, allowing quick prefix checks.
  2. Step 2: Relate to longest word search

    Finding the longest word with all prefixes present is easier with Trie traversal.
  3. Final Answer:

    To efficiently store and search words by their prefixes -> Option D
  4. Quick Check:

    Trie = prefix-based search [OK]
Hint: Trie is all about prefixes and fast prefix lookups [OK]
Common Mistakes:
  • Confusing Trie with sorting structure
  • Thinking Trie counts words only
  • Assuming Trie reverses words
2. Which of the following Rust code snippets correctly defines a Trie node struct for storing children nodes?
easy
A. struct TrieNode { children: [Option; 26] }
B. struct TrieNode { children: HashMap }
C. struct TrieNode { children: Vec> }
D. struct TrieNode { children: Vec<TrieNode> }

Solution

  1. Step 1: Understand Trie children representation

    Each node has fixed 26 children for letters a-z, stored as array of Options.
  2. Step 2: Check Rust syntax correctness

    Option allows nullable child nodes; array size 26 matches alphabet.
  3. Final Answer:

    struct TrieNode { children: [Option; 26] } -> Option A
  4. Quick Check:

    Fixed-size array with Option<Box> = correct Trie node [OK]
Hint: Use fixed-size array with Option<Box> for children in Rust Trie [OK]
Common Mistakes:
  • Using Vec without fixed size wastes memory
  • Using HashMap without Box causes ownership errors
  • Not wrapping children in Option causes panic
3. Given the following Rust code snippet that inserts words into a Trie and finds the longest word with all prefixes present, what will be the printed output?
let words = vec!["a", "app", "ap", "apply", "apple"];
let longest = find_longest_word(words);
println!("{}", longest);
Assume find_longest_word uses a Trie to find the longest word where every prefix is also a word.
medium
A. "apple"
B. "apply"
C. "app"
D. "ap"

Solution

  1. Step 1: Check prefixes for each word

    "apple" prefixes: a, ap, app, appl; "appl" missing, so invalid.
    "apply" prefixes: a, ap, app, appl; "appl" missing, invalid.
    "app" prefixes: a, ap, app; all present.
    "ap" prefixes: a, ap; all present.
  2. Step 2: Find longest valid word

    "app" is longest word with all prefixes present.
  3. Final Answer:

    "app" -> Option C
  4. Quick Check:

    Longest word with all prefixes = "app" [OK]
Hint: Check all prefixes exist before choosing longest word [OK]
Common Mistakes:
  • Assuming 'apple' or 'apply' are valid without all prefixes
  • Ignoring prefix 'appl' missing
  • Choosing shortest word instead of longest
4. The following Rust function attempts to insert words into a Trie and find the longest word with all prefixes present. It compiles but returns an empty string. What is the likely bug?
fn find_longest_word(words: Vec<&str>) -> String {
    let mut trie = Trie::new();
    for word in &words {
        trie.insert(word);
    }
    trie.search_longest_word()
}

// Trie methods:
// insert(&self, word: &str)
// search_longest_word(&self) -> String
medium
A. The function should return &str, not String
B. The insert method should take &mut self, not &self
C. Words vector should be mutable
D. The search_longest_word method should take &mut self, not &self

Solution

  1. Step 1: Analyze method signatures

    Inserting words modifies Trie, so insert must take mutable reference &mut self.
  2. Step 2: Identify compilation vs runtime issue

    Code compiles but insert called with &self means no actual insertion happens, so Trie remains empty.
  3. Final Answer:

    The insert method should take &mut self, not &self -> Option B
  4. Quick Check:

    Mutable insert needed for Trie modification [OK]
Hint: Insert modifies Trie; needs &mut self in Rust [OK]
Common Mistakes:
  • Thinking search needs mutable reference
  • Making words vector mutable unnecessarily
  • Returning wrong type String vs &str
5. You have a list of words: ["a", "banana", "app", "appl", "ap", "apply", "apple"]. Using a Trie, which word will be returned as the longest word where every prefix is also a word? Explain why the word "banana" is not chosen.
hard
A. "apple" because "banana" prefixes are missing
B. "apply" because it is longer than "apple"
C. "appl" because "appl" is a prefix of "apple" and "apply"
D. "apple" because all its prefixes exist

Solution

  1. Step 1: Check prefixes of each candidate word

    "apple" prefixes: a, ap, app, appl, apple - all present.
    "apply" prefixes: a, ap, app, appl, apply - all present.
    "banana" prefixes: b, ba, ban, bana, banan, banana - none except 'b' likely missing.
  2. Step 2: Understand why "banana" is excluded

    Since prefixes like 'b', 'ba' are not in the word list, "banana" is invalid.
    Between "apple" and "apply", both valid, but "apple" is chosen (depends on lex order or implementation).
  3. Final Answer:

    "apple" because "banana" prefixes are missing -> Option A
  4. Quick Check:

    Missing prefixes exclude "banana" [OK]
Hint: Check all prefixes exist; missing prefixes exclude word [OK]
Common Mistakes:
  • Assuming "banana" is valid without prefixes
  • Confusing "apply" as longer than "apple"
  • Ignoring prefix checks for all words
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