【LeetCode每日一练】49. 字母异位词分组(中等|JS|质数的运用)

一、题目描述

在这里插入图片描述

二、解题思路

  1. 使用哈希,对每一个词的字母排序,然后用ES6的map结构存储,然后再取出来合成结果。
  2. 质数法:利用质数的特性,质数不同,乘积不同;质数相同,乘积相同,这里字符顺序不同,但如果把每个字母对应一个质数,那么只要它们乘积相同,那么就是字母异位词。这样的话就可以少一个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)
}

猜你喜欢

转载自blog.csdn.net/weixin_40764047/article/details/111184227