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 using a Trie.
How does the work increase as the list of words gets bigger?
Analyze the time complexity of the following code snippet.
// Insert words into Trie
for (int i = 0; i < n; i++) {
insert(root, words[i]);
}
// Find longest word with all prefixes present
char* longestWord = findLongestWord(root);
This code inserts all words into a Trie and then finds the longest word where every prefix is also a 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 of the n words, each with average length m, we do m steps.
- Secondary operation: Traversing the Trie to find the longest valid word, visiting nodes up to total characters inserted.
As the number of words (n) or their average length (m) grows, the work grows roughly by n times m.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 words, avg length 5 | About 50 insert steps + traversal steps |
| 100 words, avg length 5 | About 500 insert steps + traversal steps |
| 1000 words, avg length 5 | About 5000 insert steps + traversal steps |
Pattern observation: The total steps increase roughly linearly with the total number of characters in all words.
Time Complexity: O(n * m)
This means the time grows linearly with the total number of characters in all words combined.
[X] Wrong: "The search for the longest word is just O(n) because we only check each word once."
[OK] Correct: Actually, inserting each word takes time proportional to its length, and the Trie traversal also depends on total characters, so length matters too.
Understanding how Trie operations scale helps you explain efficient word searches and prefix checks clearly in interviews.
"What if the words were sorted by length before insertion? How would that affect the time complexity?"
Practice
Trie data structure when finding the longest word in a dictionary?Solution
Step 1: Understand Trie usage
A Trie stores words by breaking them into characters and linking nodes for prefixes.Step 2: Relate to longest word search
This structure allows quick prefix checks, which helps find the longest word built from other words.Final Answer:
To efficiently store and search words by their prefixes -> Option CQuick Check:
Trie = prefix search [OK]
- Thinking Trie sorts words alphabetically
- Confusing Trie with simple arrays or lists
- Assuming Trie counts words only
Solution
Step 1: Identify children array size
Lowercase English letters are 26, so children array size must be 26.Step 2: Check structure fields
Each node has an array of pointers and a flag for word end, matching typedef struct TrieNode { struct TrieNode* children[26]; int isEndOfWord; } TrieNode;.Final Answer:
typedef struct TrieNode { struct TrieNode* children[26]; int isEndOfWord; } TrieNode; -> Option AQuick Check:
26 children for a-z [OK]
- Using 52 for uppercase + lowercase without need
- Using 10 children for digits only
- Not using array for children pointers
char* words[] = {"a", "ap", "app", "appl", "apple", "apply"};
// Assume insert and search functions are correct
// Function finds longest word where all prefixes exist
printf("%s", longestWord(words, 6));Solution
Step 1: Check all prefixes for each word
Words like "apple" and "apply" have all prefixes present: a, ap, app, appl.Step 2: Compare lengths of valid words
"apple" and "apply" both have length 5, but "apple" comes first lexicographically.Final Answer:
apple -> Option AQuick Check:
Longest valid word = apple [OK]
- Choosing 'apply' ignoring lex order
- Picking shorter words like 'app'
- Not verifying all prefixes exist
void insert(TrieNode* root, char* word) {
TrieNode* node = root;
for (int i = 0; word[i]; i++) {
int index = word[i] - 'a';
if (!node->children[index])
node->children[index] = createNode();
node = node->children[index];
}
node->isEndOfWord = 1;
}
char* longestWord(char** words, int n) {
TrieNode* root = createNode();
for (int i = 0; i < n; i++)
insert(root, words[i]);
// Missing code to find longest word
return "";
}Solution
Step 1: Analyze insert function
Insert correctly adds words and marks end of word, so no issue here.Step 2: Check longestWord function
It inserts words but returns empty string without searching Trie for longest word.Final Answer:
The longestWord function does not search the Trie for the longest word -> Option BQuick Check:
Missing search logic causes empty output [OK]
- Assuming insert alone finds longest word
- Ignoring missing traversal in longestWord
- Thinking root node is uninitialized
Solution
Step 1: Insert all words into Trie
Build Trie with all dictionary words, marking end of word nodes.Step 2: Use DFS to find longest word
Traverse Trie depth-first, only continuing on nodes that mark end of words to ensure all prefixes exist.Step 3: Track longest word during traversal
Keep updating longest word found by length and lex order during DFS.Final Answer:
Insert all words into Trie, then do DFS checking only nodes marking end of words to build longest word -> Option DQuick Check:
Trie + DFS + endOfWord check = longest word [OK]
- Ignoring prefix checks during traversal
- Using BFS without endOfWord validation
- Relying on sorting without Trie
Ready to prove it?
Pass the test and this pattern moves unknown
