一、题目描述
二、解题思路
- 使用哈希,对每一个词的字母排序,然后用ES6的map结构存储,然后再取出来合成结果。
- 质数法:利用质数的特性,质数不同,乘积不同;质数相同,乘积相同,这里字符顺序不同,但如果把每个字母对应一个质数,那么只要它们乘积相同,那么就是字母异位词。这样的话就可以少一个sort的时间复杂度。
三、代码实现
方法1:
var groupAnagrams = function(strs) {
const len = strs.length
let m = new Map()
let res = []
for(let i=0;i<len;i++){
let str = strs[i].split('').sort().join('')
m.has(str)?m.get(str).push(strs[i]):m.set(str,new Array(strs[i]))
}
for(let item of m.values()){
res.push(item)
}
return res
};
方法2:
这里就利用到了质数的特性来减少时间复杂度,同时还有各种js有趣的api的使用。比如reduce()
,Object.values
。
var groupAnagrams = function(strs){
const 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]
let m = {
}
const cal = (total,num)=>{
//用ASCII码找出字母对应的质数所在位置
let char = num.charCodeAt()-97
return total*prime[char]
}
for(let str of strs){
tempstr = Array.from(str)
let key = tempstr.reduce(cal,1)
m[key]?m[key].push(str):m[key]=[str]
}
return Object.values(m)
}