字母异位词分组

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

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

示例 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
}
posted @ 2024-04-26 08:37  烟熏咸鱼干  阅读(1)  评论(0编辑  收藏  举报