zoukankan      html  css  js  c++  java
  • 字母异位词分组

    题目

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

    示例:

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

  • 相关阅读:
    js处理富文本编辑器转义、去除转义、去除HTML标签
    web sec tools / Arachni
    OS + Linux IP / Inside IP / Outside IP
    OS + Linux SMB / Samba
    OS + Linux NTP Server
    my live / PC NAS / weiliantong QNAP TS-532X 4.5.1.1495 / cipanzhenlie / raid / Synology
    summarise() regrouping output 警告
    binary_crossentropy和BinaryCrossentropy的区别
    损失函数BinaryCrossentropy例子说明
    理解功能强大的sed替换命令
  • 原文地址:https://www.cnblogs.com/smallleiit/p/14034138.html
Copyright © 2011-2022 走看看