字母异位词分组
字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 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
}