# #49 Group Anagrams

Given an array of strings `strs`, group the strings that are anagrams of each other. The result can be returned in any order.

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

#### Input

* `strs: string[]`: An array of strings

### Examples

```
Input: strs = ["abc","bca","cab","xyz","zyx"]
Output: [["abc","bca","cab"],["xyz","zyx"]]
Explanation: Two anagram groups: 'abc'-'bca'-'cab' and 'xyz'-'zyx'.
```

```
Input: strs = ["rat","tar","art","car","arc"]
Output: [["arc","car"],["art","rat","tar"]]
Explanation: Two anagram groups: 'car'-'arc' and 'rat'-'tar'-'art'.
```

```
Input: strs = ["kxac","swavb","lmq","lvhc","sjey"]
Output: [["kxac"],["lmq"],["lvhc"],["sjey"],["swavb"]]
Explanation: Each word has no anagram in the list.
```

### 怎麼解

* 把 "abc" 用成 \[1, 1, 1, 0,.....] 所以 'abc" 跟 "bca" 會是一樣的 key
* 注意 edge case 例如 "aab" 會是 \[2, 1, 0, 0...]

```javascript
/**
 * @param {string[]} strs
 * @return {string[][]}
 */
export default function anagramGroups(strs) {
  let len = strs.length;
  if (len === 0) return [];

  let lookup = new Map();
  let result = [];

  for (let i = 0; i < len; i++) {
    let key = transformFromAlphabetToCollections(strs[i]);
    if (lookup.has(key)) {
      lookup.set(key, [...lookup.get(key), strs[i]]);
    } else {
      lookup.set(key, [strs[i]]);
    }
    // [1,1,1,....]
  }

  lookup.values().forEach((val) => result.push(val));

  return result;
}

// "abc"
function transformFromAlphabetToCollections(str) {
  let result = Array.from({ length: 26 }, () => 0);
  for (let i = 0; i < str.length; i++) {
    result[str[i].charCodeAt() - 97] += 1;
  }

  return JSON.stringify(result);
}

```
