49. 字母异位词分组

97 阅读1分钟

题目描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

 

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

 

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

思路

"ate", "tae", "eat" 都被视为相同的分组,因此可以利用 hash 数组可以作为 key 的特性来唯一标识一个字符串序列,然后使用 map 将相同分组的字符串聚合到一起,最后在 append 到结果切片中。

代码

func groupAnagrams(strs []string) [][]string {
    var results [][]string
    var m map[[26]int][]string
    m = make(map[[26]int][]string)
    for _, str := range strs {
        key := getKey(str)
        m[key] = append(m[key], str)
    }
    for _, group := range m {
        results = append(results, group)
    }
    return results
}

func getKey(str string) [26]int {
    var hash [26]int
    for i := 0; i < len(str); i++ {
        hash[str[i]-'a']++
    }
    return hash
}