🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 字母异位词分组 https://leetcode-cn.com/problems/group-anagrams/ 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串 ``` 输入: ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ] ``` * `Sort`忽略参数,按元素`Unicode位点`排序,即`Unicode编码`升序排列 ``` var groupAnagrams = function(strs) { var h = new Map, k for(var i = 0; i < strs.length; i++) h.has(k = strs[i].split('').sort().join('')) ? h.get(k).push(strs[i]) : h.set(k, [strs[i]]) return Array.from(h.values()) }; ``` >任何一个大于1的自然数N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 [a, z]Unicode编码 - 97=[0, 25] 对应26个质数。每字母代表质数的乘积表示字符串 乘法交换律忽略字母顺序。算术基本定理保证不同质数 或 相同质数不同个数,乘积唯一 Map ``` var groupAnagrams = function(strs) { var h = new Map, prime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101] for(var i = 0; i < strs.length; i++) { for(var j = 0, sum = 1; j < strs[i].length; j++) sum *= prime[strs[i].charCodeAt(j) - 97] h.has(sum) ? h.get(sum).push(strs[i]) : h.set(sum, [strs[i]]) } return Array.from(h.values()) }; ``` Obj ``` var groupAnagrams = function(strs) { var h = Object.create(null), prime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101] for(var i = 0; i < strs.length; i++) { for(var j = 0, sum = 1; j < strs[i].length; j++) sum *= prime[strs[i][j].charCodeAt() - 97] h[sum] ? h[sum].push(strs[i]) : h[sum] = [strs[i]] } return Object.values(h) }; ```