LeetCode 49 字母异位词分组

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

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 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
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注