• 字母异位词分组


    题目

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

    示例:

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

  • 相关阅读:
    CSS3 resize 属性
    FE_UPWARD (Numerics) – C 中文开发手册
    Redis Renamenx 命令
    ASP Execute 方法
    Java面试题:什么时候用断言(assert)?
    Chrome DevTools谷歌浏览器开发者工具远程调试协议
    折叠 | Collapse (Components: Collapse) – Bootstrap 4 中文开发手册
    Java 之 数学相关类 Math、BigInteger、BigDecimal
    Java 之 Arrays 类
    Java 之 Random 类
  • 原文地址:https://www.cnblogs.com/smallleiit/p/14034138.html
Copyright © 2020-2023  润新知