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
}
1460

被折叠的 条评论
为什么被折叠?



