📖 Scenario: Imagine you have a list of words from a dictionary. You want to find the longest word that can be built one character at a time by other words in the list. For example, if the word is "apple", then "a", "ap", "app", "appl" must also be in the list.
🎯 Goal: Build a program that uses a Trie data structure to find the longest word in the dictionary that can be built one character at a time by other words in the dictionary.
📋 What You'll Learn
Create a TrieNode class with an array for children and a boolean to mark end of word
Create a Trie class with insert and search methods
Insert all words from the dictionary into the Trie
Find the longest word that can be built character by character
Print the longest word found
💡 Why This Matters
🌍 Real World
Tries are used in autocomplete systems, spell checkers, and word games to quickly find words and prefixes.
💼 Career
Understanding Tries helps in roles involving search engines, text processing, and coding interviews.
Progress0 / 4 steps
1
Create TrieNode class
Create a class called TrieNode with a TrieNode[] children array of size 26 and a boolean isEndOfWord initialized to false.
DSA Java
Hint
Think of each node as a letter holder with 26 possible next letters and a flag to mark if a word ends here.
2
Create Trie class with insert method
Create a class called Trie with a TrieNode root initialized in the constructor. Add a method void insert(String word) that inserts the word into the Trie by creating nodes for each character and marking the last node's isEndOfWord as true.
DSA Java
Hint
Insert each character by moving through children nodes, create new nodes if needed, and mark the end of the word.
3
Insert words and find longest word
Create a String longestWord variable initialized to empty string. Insert all words from the array words into the Trie using insert. Then write a method boolean canBuildWord(String word) that returns true if all prefixes of word are marked as isEndOfWord in the Trie. Use this method to find the longest word that can be built one character at a time and assign it to longestWord.
DSA Java
Hint
Check each word's prefixes by moving through the Trie and verifying isEndOfWord is true for all prefixes.
4
Print the longest word
Print the value of the variable longestWord using System.out.println(longestWord);.
DSA Java
Hint
Use System.out.println(longestWord); to show the result.
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 efficiently store and search words by their prefixes
B. To sort words alphabetically
C. To count the total number of words
D. To reverse the words quickly
Solution
Step 1: Understand Trie usage
A Trie stores words by their prefixes, allowing quick prefix checks.
Step 2: Relate to longest word search
Finding the longest word with all prefixes present is easier with Trie prefix checks.
Final Answer:
To efficiently store and search words by their prefixes -> Option A
Quick Check:
Trie = prefix search [OK]
Hint: Trie is best for prefix-based word searches [OK]
Common Mistakes:
Confusing Trie with sorting structures
Thinking Trie reverses words
Assuming Trie counts words only
2. Which of the following is the correct way to insert a word into a Trie node in Java?
easy
A. node.children[word[i] - 'a'] = new TrieNode();
B. node.children[word.charAt(i) - 'a'] = new TrieNode();
C. node.children[word.charAt(i)] = new TrieNode();
D. node.children[word.charAt(i) + 'a'] = new TrieNode();
Solution
Step 1: Understand character indexing
Characters are converted to index by subtracting 'a' to map 'a' to 0, 'b' to 1, etc.
Step 2: Check Java syntax for charAt
Java uses word.charAt(i) to get character at index i.
Final Answer:
node.children[word.charAt(i) - 'a'] = new TrieNode(); -> Option B
Hint: Use charAt(i) - 'a' for array index in Java [OK]
Common Mistakes:
Using word[i] instead of charAt(i)
Adding 'a' instead of subtracting
Using char directly without index conversion
3. What will be the output of the following Java code snippet that uses a Trie to find the longest word?
String[] words = {"a", "app", "ap", "apply", "apple"};
LongestWordInDictionaryUsingTrie trie = new LongestWordInDictionaryUsingTrie();
System.out.println(trie.longestWord(words));
medium
A. "app"
B. "apply"
C. "apple"
D. "ap"
Solution
Step 1: Insert all words into Trie
Words inserted: "a", "app", "ap", "apply", "apple".
Step 2: Check longest word with all prefixes present
"app" is longest where all prefixes "a", "ap", "app" exist. "apple" and "apply" prefixes "appl" missing.
Final Answer:
"app" -> Option A
Quick Check:
Longest word with all prefixes = "app" [OK]
Hint: Longest word must have all prefixes present [OK]
Common Mistakes:
Choosing longest word ignoring prefix condition
Confusing "apple" and "apply" as valid
Ignoring shorter prefix words
4. Identify the error in this Java method snippet for searching the longest word in a Trie:
public String longestWord(String[] words) {
TrieNode root = new TrieNode();
for (String w : words) insert(root, w);
String result = "";
dfs(root, new StringBuilder(), result);
return result;
}
private void dfs(TrieNode node, StringBuilder path, String result) {
if (node == null) return;
if (!node.isWord && path.length() != 0) return;
if (path.length() > result.length()) result = path.toString();
for (int i = 0; i < 26; i++) {
if (node.children[i] != null) {
path.append((char)(i + 'a'));
dfs(node.children[i], path, result);
path.deleteCharAt(path.length() - 1);
}
}
}
medium
A. The insert method is missing
B. The dfs method does not check for null children
C. The result string is not updated correctly inside dfs due to pass-by-value
D. The path StringBuilder is not cleared after recursion
Solution
Step 1: Analyze result parameter usage
String is immutable and passed by value, so updating result inside dfs does not affect outer variable.
Step 2: Understand effect on final output
Result remains empty because changes inside dfs do not persist outside recursion.
Final Answer:
The result string is not updated correctly inside dfs due to pass-by-value -> Option C
Quick Check:
String immutability causes result update failure [OK]
Hint: Use a mutable object or class field for result [OK]
Common Mistakes:
Assuming String updates persist in recursion
Ignoring missing insert method
Overlooking null checks in children
5. Given a list of words, how would you modify the Trie-based algorithm to return the lexicographically smallest longest word when multiple longest words exist?
hard
A. Store all words in a list and pick the smallest after Trie traversal
B. Sort the input words first and insert into Trie in reverse order
C. Use a max heap to store all longest words and pop the smallest lexicographically
D. Traverse children in alphabetical order during DFS and update result only if new word is longer or lex smaller
Solution
Step 1: Traverse children in alphabetical order
DFS visits children from 'a' to 'z' ensuring lex order traversal.
Step 2: Update result conditionally
Update result only if new word is longer or same length but lex smaller.
Step 3: Ensure final result is lex smallest longest word
This approach naturally picks lex smallest among longest words.
Final Answer:
Traverse children in alphabetical order during DFS and update result only if new word is longer or lex smaller -> Option D
Quick Check:
Lex order DFS + conditional update = Traverse children in alphabetical order during DFS and update result only if new word is longer or lex smaller [OK]
Hint: DFS children from 'a' to 'z' and update result carefully [OK]
Common Mistakes:
Sorting input but not controlling DFS order
Using data structures that add unnecessary complexity
Ignoring lex order during traversal
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.