leetcode 49 字母异位分组(字符串排序+哈希表)


链接:https://leetcode-cn.com/problems/group-anagrams/

题目

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

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

用例

示例 1:

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

输入: strs = [""]
输出: [[""]]
示例 3:

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

思路

对比字符串是否异位 可以先对其排序 排序后一致则说明异位
对于每个字母异位词 可以以> 存入hash表
key值为字母异位词的排序后的字符序列,value值存储满足同一异位词的字符串集合
最后遍历哈希表,将每一个key对应的集合插入答案集合.

代码

class Solution {
public:
    vector> groupAnagrams(vector& strs) {
        unordered_map> mp;//哈希表
        string temp;
        vector> ans;//答案数组
        for(decltype(strs.size()) i=0;isecond).push_back(strs[i]);
            }else//未发现对应 异位词 更新key值
            {
                mp.insert(pair>(temp,{strs[i]}));
            }
        }
        for(auto p : mp)//遍历hash
        {
            ans.push_back(p.second);
        }
        return ans;

    }

};

官方答案

class Solution {
public:
    vector> groupAnagrams(vector& strs) {
        unordered_map> mp;
        for (string& str: strs) {
            string key = str;
            sort(key.begin(), key.end());
            mp[key].emplace_back(str);
        }
        vector> ans;
        for (auto it = mp.begin(); it != mp.end(); ++it) {
            ans.emplace_back(it->second);
        }
        return ans;
    }
};

其实还有一种思路 因为对应26个字母
可以将字母对应成26个质数 然后对字符串每个字符对应质数作乘积 如果乘积相同 则为异位数