Given an array of strings, group anagrams together.
Example:
Input: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
Output:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
Note:
All inputs will be in lowercase.
The order of your output does not matter.
解题思路
- 根据各字母出现次数,按字母表顺序构造的字符串正好能当做分组的 Key
- 字符串的拼接可以使用 bytes.Buffer
func getKey(str string) string {
// 记录 26 个英文字母出现的次数
cnt := [26]int{}
for _, c := range str {
cnt[int(c-'a')]++
}
// 各个字母出现次数相同即为一组,拥有相同的 key
var key bytes.Buffer
for _, n := range cnt {
key.WriteByte(byte(n))
}
return key.String()
}
func groupAnagrams(strs []string) [][]string {
result := [][]string{}
kv := map[string][]string{}
for _, s := range strs {
key := getKey(s)
kv[key] = append(kv[key], s)
}
for _, v := range kv {
result = append(result, v)
}
return result
}