字母异位词分组

题目

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

输入: ["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

posted @ 2020-11-25 09:41  small_lei_it  阅读(158)  评论(0编辑  收藏  举报