力扣49 字母异位词分组

力扣49 字母异位词分组

题目描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

输入输出样例

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

输入: strs = [""]
输出: [[""]]
输入: strs = ["a"]
输出: [["a"]]

解法一:hash+字符串排序

    //利用哈希存储,根据字符串排序的关系
    vector<vector<string>>groupAnagrams(vector<string>&strs)
    {
        vector<vector<string>>res;
       //构建散列表,键为 string
        unordered_map<string,vector<string>>mp;

        for(auto tempStr:strs)
        {
            string key=tempStr;
            //将字符串排序
            sort(key.begin(),key.end());

            //如果排序的字符相同则添加该值到数组中 
            mp[key].push_back(tempStr);
        }

        //将hash表中的值添加到二维 数组中
        for(auto it=mp.begin();it!=mp.end();it++)
        {
            //将值传给容器中
            res.push_back(it->second);
        }

        return res;
    }

解法2:hash+记录字符串各字母出现的次数


    //使用hash来存储根据字符串中字母出现的次数来进行实现
     vector<vector<string>>groupAnagrams2(vector<string>&strs)
     {
        vector<vector<string>>res;
       //构建散列表,键为 string
        unordered_map<string,vector<string>>mp;

        //统计string 的各字母出现的频次,以频次作为key写入队列中
        for(auto tempStr:strs)
        {
            //初始化st字符串
            //分派了26个字符串的空间,计算每个字符出现的次数
            string st=string(26,'0');
            for(auto c:tempStr)
            {
                st[c-'a']++;
            }
            cout<<st<<endl;
            mp[st].push_back(tempStr);
        }

                //将hash表中的值添加到二维 数组中
        for(auto it=mp.begin();it!=mp.end();it++)
        {
            //将值传给容器中
            res.push_back(it->second);
        }

        return res;
     }


你可能感兴趣的:(力扣刷题,leetcode,哈希算法,散列表)