Group Anagrams Using Hash Map in DSA Javascript - Time & Space Complexity
We want to understand how the time needed to group anagrams grows as the list of words gets bigger.
Specifically, how does the code handle many words and their letters efficiently?
Analyze the time complexity of the following code snippet.
function groupAnagrams(words) {
const map = new Map();
for (const word of words) {
const sorted = word.split('').sort().join('');
if (!map.has(sorted)) {
map.set(sorted, []);
}
map.get(sorted).push(word);
}
return Array.from(map.values());
}
This code groups words that are anagrams by sorting each word and using the sorted word as a key in a map.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping over each word and sorting its letters.
- How many times: The outer loop runs once per word (n times). Sorting runs once per word on word length k.
As the number of words (n) grows, the code sorts each word of length k, so work grows with both n and k.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 (words) | About 10 times sorting each word (k log k per word) |
| 100 (words) | About 100 times sorting each word |
| 1000 (words) | About 1000 times sorting each word |
Pattern observation: The total work grows linearly with the number of words and depends on sorting each word's letters.
Time Complexity: O(n * k log k)
This means the time grows with the number of words and the cost to sort each word's letters.
[X] Wrong: "Sorting each word is constant time, so overall time is just O(n)."
[OK] Correct: Sorting depends on word length k, so sorting each word takes about k log k time, which adds up across all words.
Understanding this time complexity helps you explain how your solution scales with input size, a key skill in interviews.
"What if we used character count arrays as keys instead of sorting? How would the time complexity change?"
Practice
Solution
Step 1: Understand anagrams
Anagrams are words with the same letters in different orders, so sorting letters gives a unique key.Step 2: Use sorted string as hash map key
By sorting each word and using it as a key, all anagrams map to the same key and can be grouped.Final Answer:
Use sorted strings as keys to group words with the same letters -> Option DQuick Check:
Sorted word keys group anagrams = C [OK]
- Grouping by word length only
- Using first letter as key
- Counting vowels instead of letters
Solution
Step 1: Identify hash map initialization in JavaScript
JavaScript objects ({}) are commonly used as hash maps for key-value pairs.Step 2: Analyze the options
{}creates a simple hash map using bracket notation likemap[key].Map()withoutnewthrows TypeError.[]creates an array unsuitable for key-value pairs.new Set()stores unique values, not mappings.Final Answer:
const map = {}; -> Option AQuick Check:
Object literal {} is simplest hash map = A [OK]
- Using array [] instead of object
- Using Set which doesn't store key-value pairs
- Confusing Map and object initialization
function groupAnagrams(words) {
const map = {};
for (const word of words) {
const sorted = word.split('').sort().join('');
if (!map[sorted]) map[sorted] = [];
map[sorted].push(word);
}
return Object.values(map);
}
console.log(groupAnagrams(['bat', 'tab', 'eat', 'tea', 'ate']));Solution
Step 1: Sort each word and group in map
Words 'bat' and 'tab' both sort to 'abt', so grouped together. 'eat', 'tea', 'ate' all sort to 'aet', grouped together.Step 2: Return grouped anagrams as array of arrays
Object.values(map) returns arrays of grouped words: [['bat', 'tab'], ['eat', 'tea', 'ate']].Final Answer:
[['bat', 'tab'], ['eat', 'tea', 'ate']] -> Option CQuick Check:
Sorted keys group words = [['bat','tab'],['eat','tea','ate']] [OK]
- Returning flat list instead of grouped arrays
- Not sorting words before grouping
- Syntax errors from missing brackets
function groupAnagrams(words) {
const map = {};
for (const word of words) {
const sorted = word.sort().join('');
if (!map[sorted]) map[sorted] = [];
map[sorted].push(word);
}
return Object.values(map);
}Solution
Step 1: Identify the error in sorting
word is a string, and strings do not have a sort() method. It must be split into an array first.Step 2: Correct approach to sort letters
Use word.split('').sort().join('') to sort letters of the string correctly.Final Answer:
word.sort() is invalid because word is a string, not an array -> Option BQuick Check:
Strings need split() before sort() = B [OK]
- Calling sort() directly on string
- Not splitting string before sorting
- Confusing Map object with plain object
['listen', 'silent', 'enlist', 'google', 'gogole', 'abc', 'cab'], which of the following is the correct grouped anagrams output using a hash map approach?Solution
Step 1: Sort each word to find keys
'listen', 'silent', 'enlist' all sort to 'eilnst'; 'google', 'gogole' sort to 'eggloo'; 'abc', 'cab' sort to 'abc'.Step 2: Group words by sorted keys
Group words with same sorted key together: [['listen', 'silent', 'enlist'], ['google', 'gogole'], ['abc', 'cab']].Final Answer:
[['listen', 'silent', 'enlist'], ['google', 'gogole'], ['abc', 'cab']] -> Option AQuick Check:
Sorted keys group anagrams correctly = A [OK]
- Mixing groups with different sorted keys
- Grouping by word length instead of letters
- Returning flat list instead of grouped arrays
Ready to prove it?
Pass the test and this pattern moves unknown
