Longest Word in Dictionary Using Trie in DSA Typescript - Time & Space Complexity
We want to understand how the time needed to find the longest word using a Trie grows as the dictionary size increases.
Specifically, how the operations scale when building and searching the Trie.
Analyze the time complexity of the following code snippet.
class TrieNode {
children: Map = new Map();
isWord: boolean = false;
}
function insert(root: TrieNode, word: string): void {
let node = root;
for (const char of word) {
if (!node.children.has(char)) node.children.set(char, new TrieNode());
node = node.children.get(char)!;
}
node.isWord = true;
}
This code inserts words into a Trie, letter by letter, marking the end of each word.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each character of every word to insert into the Trie.
- How many times: For each of the n words, we loop through its length m characters.
As the number of words (n) and their average length (m) grow, the total operations increase roughly by n times m.
| Input Size (n words, avg length m) | Approx. Operations |
|---|---|
| 10 words, length 5 | ~50 operations |
| 100 words, length 5 | ~500 operations |
| 1000 words, length 5 | ~5000 operations |
Pattern observation: Operations grow linearly with both number of words and their length.
Time Complexity: O(n * m)
This means the time grows proportionally to the total number of characters in all words combined.
[X] Wrong: "Inserting all words into a Trie is just O(n) because we only loop over words once."
[OK] Correct: Each word has multiple characters, so we actually loop over every character in every word, making it O(n * m), not just O(n).
Understanding this complexity helps you explain how Tries efficiently handle many words and why they are preferred for prefix-based problems.
What if we changed the data structure to a simple array and searched for the longest word by checking prefixes? How would the time complexity change?
Practice
Solution
Step 1: Understand Trie usage
A Trie stores words by breaking them into characters and linking nodes for prefixes.Step 2: Connect Trie 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 AQuick Check:
Trie = prefix search [OK]
- Thinking Trie sorts words alphabetically
- Confusing Trie with simple arrays
- Assuming Trie counts words only
Solution
Step 1: Check children type
Children should map characters (string) to TrieNode objects, so Map is correct.Step 2: Check isEnd flag type
isEnd should be boolean to mark word end, so boolean = false is correct.Final Answer:
class TrieNode { children: Map = new Map(); isEnd: boolean = false; } -> Option AQuick Check:
Correct types = class TrieNode { children: Map = new Map(); isEnd: boolean = false; } [OK]
- Using array instead of Map for children
- Using wrong types for isEnd flag
- Mixing key and value types in Map
const words = ["a", "app", "apple", "apply", "ap"]; const trie = new Trie(); words.forEach(word => trie.insert(word)); console.log(trie.findLongestWord());
Solution
Step 1: Insert words into Trie
Words "a", "app", "apple", "apply", "ap" are inserted. Trie stores prefixes for all.Step 2: Find longest word with all prefixes present
"app" has all prefixes present: "a", "ap", "app". "apple" and "apply" require "appl" which is not a word in the list.Final Answer:
"app" -> Option DQuick Check:
Longest word with all prefixes = "app" [OK]
- Choosing "apple" or "apply" without checking if "appl" is a word
- Ignoring that intermediate prefixes like "appl" must be full words
- Picking the overall longest word without prefix validation
insert(word: string) {
let node = this.root;
for (const char of word) {
node = node.children.get(char);
if (!node.children.has(char)) {
node.children.set(char, new TrieNode());
}
}
node.isEnd = true;
}
What is the main issue causing a runtime error?Solution
Step 1: Analyze node update inside loop
node.children.get(char) may return undefined if key missing, but code assumes it returns TrieNode.Step 2: Identify cause of runtime error
If undefined assigned to node, next iteration fails accessing children of undefined.Final Answer:
node.children.get(char) can return undefined, causing node to be undefined -> Option CQuick Check:
Undefined node from get() causes error [OK]
- Ignoring possibility of undefined from Map.get()
- Assuming loop skips characters
- Confusing isEnd flag placement
Solution
Step 1: Check prefixes for "world"
Prefixes: "w", "wo", "wor", "worl" all exist in list.Step 2: Check prefixes for "banana" and "banan"
"banana" and "banan" are missing shorter prefixes like "b" and "ba" which are not in the list.Step 3: Compare valid longest words
"world" is longest with all prefixes present; others longer but invalid.Final Answer:
"world" -> Option BQuick Check:
Longest word with all prefixes = "world" [OK]
- Choosing "banana" ignoring missing prefix like "b"
- Confusing similar prefixes
- Not verifying all prefixes exist
Ready to prove it?
Pass the test and this pattern moves unknown
