力扣49字母异位词分组

本文介绍了一种用于将一组字符串按字母出现频率分组的高效算法。该算法首先检查输入是否为空,然后通过建立26个长度的数组来记录每个字符串中字母的出现次数,并使用HashMap对具有相同字母频率的字符串进行分组。

题目:

解题思路:

两种解法:

(1)对每个字符串进行字母排序,显然这并不是最优解需要进行排序,时间复杂度为nlogn

(2)较优解法:

1.检查是否为空数组

2.建立一个长度为26的数组,起始值为0,有字符串组中有几个字符串就建立几个26长度的数组,如图所示每个字母对应初始值都为0,用来记录,字母的出现频率。

3.遍历所有字符串.将字母的出现频率放到数组的对应位置里(利用ascii码)

4.遍历数组,按照相同字母出现频率进行分组归类(使用hashMap),key中

5.遍历map,将结果返回

代码:

方法一:

/**

 * @param {string[]} strs

 * @return {string[][]}

 */

var groupAnagrams = function(strs) {

    if(strs.length==0)

    {

        return [];

    }

    const map=new Map();

    for(const str of strs)

    {

        let a=str.split("");

        a.sort(function(a,b){

            //通过ascii值对字母进行排序

            return a.charCodeAt()-b.charCodeAt()

        });

        const key=a.join("");

        if(map.has(key))

        {

            map.set(key,[...map.get(key),str]);

        }

        else

        {

            map.set(key,[str])

        }

 

    }

    const result=[];

    for(const arr of map)

    {

        result.push(arr[1]);

    }

    return result;

 

};

 

 

方法二:

/**

 * @param {string[]} strs

 * @return {string[][]}

 */

var groupAnagrams = function(strs) {

    if(strs.length==0)

    {

        return [];

    }

    const map=new Map();

    for(const str of strs)

    {

        const characters=Array(26).fill(0);

        for(let i=0;i<str.length;i++)

        {

            const ascii=str.charCodeAt(i)-97;

            //当输入数据为["bdddddddddd","bbbbbbbbbbc"]这时由于刚好为d和b10个则会使key值刚好相等,

            //只需要对超出10个的数据进行处理

            if(characters[ascii]<10)

            {

            characters[ascii]++;

            }

            if(characters[ascii]>=10)

            {               

                characters[i]=characters[i]+"a";

            }

        }

        const key=characters.join("");

        if(map.has(key))

        {

            map.set(key,[...map.get(key),str]);

        }

        else

        {

            map.set(key,[str]);

        }

 

    }

    const result=[];

    for(const arr of map)

    {

        result.push(arr[1]);

    }

    return result;

 

};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值