Longest Word in Dictionary Using Trie in DSA C# - Time & Space Complexity
We want to understand how the time needed grows when finding the longest word in a dictionary using a Trie.
How does the number of steps change as the dictionary gets bigger?
Analyze the time complexity of the following code snippet.
public class TrieNode {
public TrieNode[] children = new TrieNode[26];
public bool isWord = false;
}
public void Insert(TrieNode root, string word) {
TrieNode node = root;
foreach (char c in word) {
int index = c - 'a';
if (node.children[index] == null) node.children[index] = new TrieNode();
node = node.children[index];
}
node.isWord = true;
}
This code inserts words into a Trie, marking the end of each word.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Inserting each word character by character into the Trie.
- How many times: For each word, the loop runs once per character; for all words, this repeats for every character in the dictionary.
As the dictionary grows, the total characters inserted increase, so the work grows with total characters.
| Input Size (n = number of words) | Approx. Operations (total characters) |
|---|---|
| 10 | ~50 (if average word length is 5) |
| 100 | ~500 |
| 1000 | ~5000 |
Pattern observation: The operations grow roughly in proportion to the total number of characters across all words.
Time Complexity: O(N * L)
This means the time grows with the number of words (N) times the average length of each word (L).
[X] Wrong: "Inserting all words is just O(N) because we only loop over words once."
[OK] Correct: Each word has multiple characters, so the inner loop over characters matters and multiplies the work.
Understanding this complexity helps you explain how tries efficiently handle many words and why character-level operations matter.
"What if we used a hash set instead of a Trie? How would the time complexity for finding the longest word change?"
Practice
Trie data structure when finding the longest word in a dictionary?Solution
Step 1: Understand Trie structure
A Trie stores words by sharing common prefixes, making prefix searches fast.Step 2: Relate to longest word search
Finding the longest word with all prefixes present is easier using Trie traversal.Final Answer:
To efficiently store and search words by their prefixes -> Option BQuick Check:
Trie = prefix search [OK]
- Confusing Trie with sorting algorithms
- Thinking Trie reverses words
- Assuming Trie counts words only
Solution
Step 1: Check children storage type
Using a Dictionary allows dynamic children mapping by character.Step 2: Confirm boolean flag for word end
IsWord marks if node completes a valid word.Final Answer:
public class TrieNode { public Dictionary Children = new Dictionary(); public bool IsWord = false; } -> Option AQuick Check:
Dictionary + IsWord = correct TrieNode [OK]
- Using List<char> instead of mapping to nodes
- Using char array without node references
- Missing IsWord flag
var words = new string[] {"a", "app", "ap", "apply", "apple"};
var trie = new Trie();
foreach(var w in words) trie.Insert(w);
var longest = trie.FindLongestWord();
Console.WriteLine(longest);
Assuming FindLongestWord returns the longest word where all prefixes exist in the Trie.Solution
Step 1: Insert all words into Trie
Words inserted: "a", "app", "ap", "apply", "apple".Step 2: 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 exist.
"ap" prefixes: "a", "ap" exist but shorter than "app".Final Answer:
"app" -> Option DQuick Check:
Longest word with all prefixes = "app" [OK]
- Assuming 'apple' or 'apply' are valid without all prefixes
- Ignoring prefix 'appl' missing
- Choosing shortest word instead
public void Insert(string word) {
var node = root;
foreach (char c in word) {
if (!node.Children.ContainsKey(c))
node.Children[c] = new TrieNode();
node = node.Children[c];
node.IsWord = true;
}
}Solution
Step 1: Analyze IsWord assignment
IsWord should be true only at the end of the word, not for every character node.Step 2: Identify correct placement
IsWord = true must be set after the loop completes, marking the last node.Final Answer:
Setting IsWord = true inside the loop for every character -> Option AQuick Check:
IsWord only at word end [OK]
- Marking IsWord true too early
- Ignoring Children initialization
- Confusing loop types
Solution
Step 1: Check prefixes for each candidate
"world" prefixes: "w", "wo", "wor", "worl", "world" all exist.
"worst" prefixes: "w", "wo", "wor", "wors" (missing), invalid.
"word" prefixes: "w", "wo", "wor", "word" all exist but shorter than "world".
"worl" prefixes: "w", "wo", "wor", "worl" all exist but shorter.Step 2: Choose longest valid word
"world" is longest with all prefixes present.Final Answer:
"world" -> Option CQuick Check:
Longest word with all prefixes = "world" [OK]
- Choosing 'worst' without 'wors' prefix
- Ignoring prefix checks
- Picking shorter words
Ready to prove it?
Pass the test and this pattern moves unknown
