Start learning free

LESSON 266 OF 410 · HASH TABLE

Group Anagrams II in JavaScript (O(n * L * log L) Time Complexity)

Practice O(n * L * log L) Read the full explanation

Given an array of strings, group the anagrams together. You can return the answer in any order.

An anagram is a word or phrase formed by rearranging the letters of a different word or phrase, using all the original letters exactly once.

Example:

Input:   strings = ["eat","tea","tan","ate","nat","bat"]

Output:  [["bat"],["nat","tan"],["ate","eat","tea"]]

Note:

Your algorithm should run in O(n * L * log L) time and use O(n * L) extra space, where n is the number of strings and L is the length of the longest string.


STEP 1 OF 6
    Ctrl + Enter to check

    JAVASCRIPT · HASH TABLE

    Group Anagrams in JavaScript, explained

    Understanding the Problem

    The core challenge of this problem is to identify and group words that are anagrams of each other. An anagram is a rearrangement of the letters of a word to form another word. For example, "eat" and "tea" are anagrams because they contain the same letters.

    This problem has practical applications in text analysis, cryptography, and data clustering.

    Potential pitfalls include not correctly identifying anagrams or inefficiently grouping them, leading to suboptimal performance.

    Approach

    To solve this problem, we need to group words that are anagrams. A naive solution might involve comparing each word with every other word, but this would be inefficient with a time complexity of O(n^2 * L). Instead, we can use a more optimized approach:

    Optimized Approach

    1. **Sort and Hash**: The idea is to sort each word and use the sorted word as a key in a hash map. All anagrams will have the same sorted key.

    2. **Hash Map**: Use a hash map to group words by their sorted version.

    Steps to Derive the Solution

    1. Initialize an empty hash map.
    2. For each word in the input array, sort the word and use it as a key in the hash map.
    3. Append the original word to the list of words corresponding to the sorted key.
    4. Return the values of the hash map as the grouped anagrams.

    Algorithm

    Here is a step-by-step breakdown of the algorithm:

    1. Initialize an empty hash map `anagramGroups`.
    2. Iterate over each word in the input array.
    3. Sort the characters of the word to form the key.
    4. If the key is not in the hash map, add it with an empty list as its value.
    5. Append the original word to the list corresponding to the sorted key.
    6. After processing all words, return the values of the hash map.

    Code Implementation

    
    // Function to group anagrams
    function groupAnagrams(strs) {
        // Initialize an empty hash map
        const anagramGroups = {};
    
        // Iterate over each word in the input array
        for (let str of strs) {
            // Sort the characters of the word to form the key
            const sortedStr = str.split('').sort().join('');
    
            // If the key is not in the hash map, add it with an empty list as its value
            if (!anagramGroups[sortedStr]) {
                anagramGroups[sortedStr] = [];
            }
    
            // Append the original word to the list corresponding to the sorted key
            anagramGroups[sortedStr].push(str);
        }
    
        // Return the values of the hash map
        return Object.values(anagramGroups);
    }
    
    // Example usage
    const strings = ["eat", "tea", "tan", "ate", "nat", "bat"];
    console.log(groupAnagrams(strings)); // Output: [["bat"],["nat","tan"],["ate","eat","tea"]]
    

    Complexity Analysis

    The time complexity of this approach is O(n * L * log L), where n is the number of words and L is the maximum length of a word. This is because sorting each word takes O(L * log L) time, and we do this for each of the n words.

    The space complexity is O(n * L) because we store each word in the hash map.

    Edge Cases

    Potential edge cases include:

    • Empty input array: The function should return an empty array.
    • Single word input: The function should return an array with one group containing the single word.
    • All words are anagrams: The function should return one group containing all words.

    Examples:

    Input: []
    Output: []
    
    Input: ["abc"]
    Output: [["abc"]]
    
    Input: ["abc", "bca", "cab"]
    Output: [["abc", "bca", "cab"]]
    

    Testing

    To test the solution comprehensively, consider the following test cases:

    • Simple cases with a few words.
    • Cases with no anagrams.
    • Cases with all words being anagrams.
    • Edge cases like empty input or single word input.

    Use a testing framework like Jest or Mocha for automated testing.

    Thinking and Problem-Solving Tips

    When approaching such problems:

    • Understand the problem requirements and constraints.
    • Think about different ways to represent the problem (e.g., sorting, hashing).
    • Consider the time and space complexity of your solution.
    • Test your solution with various edge cases.

    Practice solving similar problems to improve your problem-solving skills.

    Conclusion

    Grouping anagrams is a common problem that can be efficiently solved using sorting and hashing. Understanding the problem, considering different approaches, and analyzing their complexities are crucial steps in developing an optimal solution.

    Keep practicing and exploring different problems to enhance your algorithmic thinking and coding skills.

    Additional Resources

    Keep going with JavaScriptAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free