题目
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ] 说明:
所有输入均为小写字母。不考虑答案输出的顺序。
解题思路
这里要用到查找,我们知道哈希表查找很快,所以想办法构造一个哈希表,我们可以将字符串按ACSII码排序,在通过比较字符串是否相同,这种方法不难想到,接下来主要分享一下评论中看到的一个比较骚的操作。
**用质数表示26个字母的 ASCII 值 ,把字符串的各个字母相乘,这样可保证字母异位词的乘积必定是相等的。**则可以通过比较乘积判断字符串是否相同。
代码
package main import "fmt" var dic = map[byte]int{'a': 2, 'b': 3, 'c': 5, 'd': 7, 'e': 11, 'f': 13, 'g': 17, 'h': 19, 'i': 23, 'j': 29, 'k': 31, 'l': 37, 'm': 41, 'n': 43, 'o': 47, 'p': 53, 'q': 59, 'r': 61, 's': 67, 't': 71, 'u': 73, 'v': 79, 'w': 83, 'x': 89, 'y': 97, 'z': 101, } func groupAnagrams(arr []string) [][]string { dictStr := map[int][]string{} var res [][]string for _, str := range arr { m := 1 for i := 0; i < len(str); i++ { m = m*dic[str[i]] } if dictStr[m] == nil { dictStr[m] = []string{} } dictStr[m] = append(dictStr[m], str) } for _, v := range dictStr { res = append(res, v) } return res } func main() { ss := []string{"eat", "tea", "tan", "ate", "nat", "bat"} res := groupAnagrams(ss) fmt.Println(res) }
地址:https://mp.weixin.qq.com/s/77pv5jqfUJN0d69eByNmHg