leetcode 49. 字母异位词分组

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

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母
    //290ms
    //将字符串排序 e.g.bab->abb,然后遍历比较
    class Solution {
    public:
        vector<vector<string>> groupAnagrams(vector<string>& strs) {
            vector<string> sortStrs=strs;
            vector<int> flag(strs.size(),0);
            vector<vector<string>> res;
            int k=-1;
            int m;
            for(int i=0;i<sortStrs.size();i++){
                sort(sortStrs[i].begin(),sortStrs[i].end());
            }
            for(int i=0;i<sortStrs.size();i++){
                if(flag[i]==1) continue;
                flag[i]=1;
                m=0;
                res.push_back(vector<string>());
                res[res.size()-1].push_back(strs[i]);
                for(int j=i+1;j<sortStrs.size();j++){
                    if(sortStrs[j]==sortStrs[i]){
                        flag[j]=1;
                        res[res.size()-1].push_back(strs[j]);
                    }
                }
            }
            return res;
        }
    };
    //官方题解
    //24ms
    //哈希表 bab—>abb,abb作为键
    class Solution {
    public:
        vector<vector<string>> groupAnagrams(vector<string>& strs) {
            unordered_map<string, vector<string>> mp;
            for (string& str: strs) {
                string key = str;
                sort(key.begin(), key.end());
                mp[key].emplace_back(str);
            }
            vector<vector<string>> ans;
            for (auto it = mp.begin(); it != mp.end(); ++it) {
                ans.emplace_back(it->second);
            }
            return ans;
        }
    };
    
    //23ms
    //依旧是哈希表,键为26长度的数组,该数组记录了一个字符串字母的出现次数
    class Solution {
    public:
        vector<vector<string>> groupAnagrams(vector<string>& strs) {
            // 自定义对 array<int, 26> 类型的哈希函数
            auto arrayHash = [fn = hash<int>{}] (const array<int, 26>& arr) -> size_t {
                return accumulate(arr.begin(), arr.end(), 0u, [&](size_t acc, int num) {
                    return (acc << 1) ^ fn(num);
                });
            };
    
            unordered_map<array<int, 26>, vector<string>, decltype(arrayHash)> mp(0, arrayHash);
            for (string& str: strs) {
                array<int, 26> counts{};
                int length = str.length();
                for (int i = 0; i < length; ++i) {
                    counts[str[i] - 'a'] ++;
                }
                mp[counts].emplace_back(str);
            }
            vector<vector<string>> ans;
            for (auto it = mp.begin(); it != mp.end(); ++it) {
                ans.emplace_back(it->second);
            }
            return ans;
        }
    };
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值