字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
func groupAnagrams(strs []string) [][]string {
groupMap := make(map[[26]int][]string)
for i := range strs {
intArray := [26]int{}
for j := range strs[i] {
intArray[strs[i][j]-'a']++
}
groupMap[intArray] = append(groupMap[intArray], strs[i])
}
returnData := make([][]string, 0, len(groupMap))
for i := range groupMap {
returnData = append(returnData, groupMap[i])
}
return returnData
}
func groupAnagrams(strs []string) [][]string {
// ["eat","tea","tan","ate","nat","bat"]
groupMap := make(map[string][]string, 0)
for i := range strs {
str := returnSortString(strs[i])
groupMap[str] = append(groupMap[str], strs[i])
}
return getMepValueArray(groupMap)
}
// 获取map中的value数组
func getMepValueArray(data map[string][]string) [][]string {
returnData := make([][]string, 0, len(data))
for i := range data {
returnData = append(returnData, data[i])
}
return returnData
}
// 返回排序好的比特数组
func returnSortString(str string) string {
b := s2b(fmt.Sprint(str))
sort.Slice(b, func(i, j int) bool {
return b[i] < b[j]
})
return b2s(b)
}
func b2s(b []byte) string {
// return string(b)
return *(*string)(unsafe.Pointer(&b))
}
func s2b(s string) (b []byte) {
// return []byte(s)
bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
bh.Data = sh.Data
bh.Cap = sh.Len
bh.Len = sh.Len
return b
}