Skip to main content

Group Anagrams

49. Group Anagrams

Medium

Group the anagrams together from an array of strings.

ArrayHash TableStringSorting
View Problem

Problem Statement

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

Example 1:

Input: strs = ["eat","tea","tan","ate","nat","bat"]
Output: [["bat"],["nat","tan"],["ate","eat","tea"]]
Explanation:
- There is no string in strs that can be rearranged to form "bat".
- The strings "nat" and "tan" are anagrams as they can be rearranged to form each other.
- The strings "ate", "eat", and "tea" are anagrams as they can be rearranged to form each other.

Example 2:

Input: strs = [""]
Output: [[""]]

Example 3:

Input: strs = ["a"]
Output: [["a"]]

Constraints:

  • 1 <= strs.length <= 10^4
  • 0 <= strs[i].length <= 100
  • strs[i] consists of lowercase English letters

Try It Yourself

TypeScript

function groupAnagrams(strs: string[]): string[][] {
// Your solution here
}

Go

func groupAnagrams(strs []string) [][]string {
// Your solution here
}

Solution

Click to reveal solution

Use a hash map where the key is the sorted string and the value is an array of anagrams.

TypeScript Solution

function groupAnagrams(strs: string[]): string[][] {
const hashmap = {}

for (const str of strs) {
const sorted = str.split("").toSorted().join("");
hashmap[sorted] ||= [];
hashmap[sorted].push(str);
}

const res = [];
Object.values(hashmap).forEach(arr => res.push(arr));
return res;
}
Time:O(n * k log k)
Space:O(n * k)

Go Solution

import (
"strings"
"slices"
)

func groupAnagrams(strs []string) [][]string {
hashmap := map[string][]string{}

for _, str := range strs {
splitted := strings.Split(str, "")
slices.Sort(splitted)
sortedStr := strings.Join(splitted, "")

_, ok := hashmap[sortedStr]
if ok {
hashmap[sortedStr] = append(hashmap[sortedStr], str)
} else {
hashmap[sortedStr] = []string{str}
}
}

res := [][]string{}

for _, val := range hashmap {
res = append(res, val)
}

return res
}
Time:O(n * k log k)
Space:O(n * k)

Algorithm:

  1. Create a hash map to group strings by their sorted characters
  2. For each string in the input array:
    • Sort the characters to create a key
    • Add the original string to the group for that key
  3. Convert the hash map values to the result array
  4. Return the grouped anagrams

Time Complexity: O(n * k log k) where n is the number of strings and k is the maximum length of a string Space Complexity: O(n * k) for storing all strings in the hash map

Alternative Approach (Character Counting): Instead of sorting, you could use character frequency counting as the key, which would give O(n * k) time complexity:

function groupAnagrams(strs: string[]): string[][] {
const hashmap = new Map<string, string[]>();

for (const str of strs) {
const count = new Array(26).fill(0);
for (const char of str) {
count[char.charCodeAt(0) - 'a'.charCodeAt(0)]++;
}
const key = count.join(',');

if (!hashmap.has(key)) {
hashmap.set(key, []);
}
hashmap.get(key)!.push(str);
}

return Array.from(hashmap.values());
}