字母异位词分组

字母异位词分组

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

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

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvaszc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

哈希表+排序

思路:字母移位词中包含的字母的数目和种类是一致的,我们对他们进行排序,就可以区分出哪些是字母异位的,这里讲排序后的字符串作为哈希表的key,用字符串切片作为value,字符串切片中的字符串互为字母异位词

代码:

func groupAnagrams(strs []string) [][]string {
	n := len(strs)
	ret := make([][]string, 0)
	m:=make(map[string][]string)
	for i := 0; i < n; i++ {
        //Go 语言中的字符串比较特殊,要先转换为数组再排序,再转换回去
		t:=[]rune(strs[i])
		sort.Slice(t, func(i, j int) bool {
			return t[i]>t[j]
		})
		t1:=string(t)
		m[t1] = append(m[t1],strs[i])
	}
	for _,v :=range m{
		ret = append(ret,v)
	}
	return ret
}

哈希表+哈希算法

排序的目的是区分字母异位词,其实还有一种方法区分,就是哈希算法,因为样例没那么强劲,用哈希算法也能过

var a [26]int = [26]int{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103}
const mod = 1000000007
func hash(s string) int{
	var hash int
	hash = 1
	n:=len(s)
	for i:=0; i<n; i++{
		hash = ((hash%mod)*a[s[i]-97])%mod
	}
	return hash
}

func groupAnagrams(strs []string) [][]string {
	n := len(strs)
	ret := make([][]string, 0)
	m:=make(map[int][]string)
	for i := 0; i < n; i++ {
		t:=hash(strs[i])
		m[t] = append(m[t],strs[i])
	}
	for _,v :=range m{
		ret = append(ret,v)
	}
	return ret
}
posted @ 2022-01-24 23:37  博客是个啥?  阅读(37)  评论(0编辑  收藏  举报