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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

LeetCode49. 字母异位词分组(2024秋季每日一题 4)_哈希表
LeetCode49. 字母异位词分组(2024秋季每日一题 4)_hash_02
LeetCode49. 字母异位词分组(2024秋季每日一题 4)_算法_03


思路:

  • 遍历给定的字符串数组,对每一个字符串,对其进行排序,如果不存在与 哈希表,则新建一个字符串数组,
  • key=排序后的字符串,value=字符串数组的下标,hash[排序后的字符串]=字符串数组的下标,
  • 例子:“ate”、“eat”,排序后都是 “aet”,所以可以通过排序判断 “字母异位词” 是否已经存在,
  • 存在的话,通过 hash 表找出对应的数组,加入进去即可。
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> res;
        unordered_map<string, int> h;
        for(const string& s: strs){
            string back_str = s;
            sort(back_str.begin(), back_str.end());
            if(h.count(back_str)){
                int idx = h[back_str];
                res[idx].push_back(s);
            }else{
                vector<string> a;
                a.push_back(s);
                res.push_back(a);
                h[back_str] = res.size() - 1;
            }
        }
        return res;
    }
};