给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 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] 仅包含小写字母
解题:
把每个单词里面的字母按顺序排列,然后用这个值作为map的键
func groupAnagrams(strs []string) [][]string {
tmpStr := make([]string, len(strs))
for i, v := range strs {
split := strings.Split(v, "")
sort.Strings(split)
tmpStr[i] = strings.Join(split, "")
}
strMap := make(map[string][]string)
for i, v := range tmpStr {
if _, ok := strMap[v]; !ok {
strMap[v] = make([]string, 0)
}
strMap[v] = append(strMap[v], strs[i])
}
res := make([][]string, 0)
for _, v := range strMap {
res = append(res, v)
}
return res
}
官方解答:
1.排序
func groupAnagrams(strs []string) [][]string {
mp := map[string][]string{}
for _, str := range strs {
s := []byte(str)
sort.Slice(s, func(i, j int) bool { return s[i] < s[j] })
sortedStr := string(s)
mp[sortedStr] = append(mp[sortedStr], str)
}
ans := make([][]string, 0, len(mp))
for _, v := range mp {
ans = append(ans, v)
}
return ans
}
2.计数
func groupAnagrams(strs []string) [][]string {
mp := map[[26]int][]string{}
for _, str := range strs {
cnt := [26]int{}
for _, b := range str {
cnt[b-'a']++
}
mp[cnt] = append(mp[cnt], str)
}
ans := make([][]string, 0, len(mp))
for _, v := range mp {
ans = append(ans, v)
}
return ans
}