---
title: '49. Group Anagrams'
description: Given an array of strings strs, group the anagrams together. You can return the answer in any order
sidebar:
  label: 'Group Anagrams'
  badge: 'Medium'
---

Array

### 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.

## Approach

```mermaid
flowchart TD
  S(["groupAnagrams(strs)"]) --> K["sorted[i] = letters of strs[i], sorted — the anagram key"]
  K --> I["anagrams = {}"]
  I --> L{"more i in 0..n-1?"}
  L -- no --> E(["return Object.values(anagrams)"])
  L -- yes --> Q{"anagrams has sorted[i]?"}
  Q -- no --> N["anagrams[sorted[i]] = [strs[i]]"]
  Q -- yes --> P["anagrams[sorted[i]].push(strs[i])"]
  N --> L
  P --> L
```

## Solution

```js
/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
  let sorted = strs.map(str => str.split("").sort().join(""));
  let anagrams = {};

  for (let i = 0; i < strs.length; i++){
    if(!anagrams[sorted[i]]){
      anagrams[sorted[i]] = [strs[i]]
    }else{
      anagrams[sorted[i]].push(strs[i])
    }
  }

  return Object.values(anagrams);
};
```

## Explanation

[Group Anagrams - Categorize Strings by Count - Leetcode 49](https://www.youtube.com/watch?v=vzdNOK2oB2E)
