49. 字母异位词分组

https://leetcode.cn/problems/group-anagrams/description/?envType=study-plan-v2&envId=top-100-liked

题目要求将字母异位词分组。给出两种Go语言解法:

排序法:将字符串排序后作为哈希表的键,时间复杂度O(nklogk),其中k是字符串最大长度。

计数法:统计每个字符串中字母出现次数,将计数数组作为哈希表键,时间复杂度O(nk),空间效率更高。

两种方法都能正确分组异位词,最终返回分组后的字符串切片。计数法通过字母统计直接生成键值,避免了排序操作,在性能上更优。

func groupAnagrams(strs []string) [][]string {
	//将给定的字符串排序后,作为map的key,value为字符串的数组
	mp := make(map[string][]string)
	for _, str := range strs {
		// 排序
		sortedStr := sortString(str)
		mp[sortedStr] = append(mp[sortedStr], str)
	}

    res := make([][]string, 0, len(mp))
	for _, v := range mp {
		res = append(res, v)
	}
	return res
}

func sortString(str string) string{
	chars := strings.Split(str, "")
	sort.Strings(chars)
	return strings.Join(chars, "")
}
// 使用计数排序,因为在go中定长的数组是基本数据类型我们可以直接那各字母的统计数组作为key
func groupAnagrams(strs []string) [][]string {
	mp := make(map[[26]int][]string)
	for _, str := range strs {
		count := [26]int{} // 初始化一个长度为26的数组,表示26个字母的计数
		for _, ch := range str {
			count[ch - 'a']++ // 统计每个字母出现的次数
		}
		mp[count] = append(mp[count], str)
	}
	res := make([][]string, 0, len(mp))
	for _, v := range mp {
		res = append(res, v)
	}
	return res
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值