leetcode:49. 字母异位词分组

题目来源

题目描述

在这里插入图片描述

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {

    }
};

题目解析

这应该是一个简单题目,关键在于理解题意。题目要求给使用了相同字符的单词进行分组。

也就是说如果两个字符串所含字符种类一样,每个字符所含个数一样,那么就是一类。问整个字符数组中有几类

比如对于例子一:

我们可以将字符串数组中的每个字符串排序,然后两两进行比较,如果返回true,表示是就可以分为一类
在这里插入图片描述

哈希解法一

  1. 准备几个bucket,用于存放分组后的原字符串

在这里插入图片描述
2. 根据排序后的字符串,找到所属的bucket,将原字符串放入bucket
在这里插入图片描述
3. 符串数组遍历结束后,就完成了分组
在这里插入图片描述
将每个bucket中的子结果集放到最终的结果集中

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        int len = strs.size();
        vector<vector<string>> ans;
        std::map<std::string, vector<string>> hash;

        for (int i = 0; i < len; ++i) {
            std::string key = strs[i];
            std::sort(key.begin(), key.end());
            hash[key].push_back(strs[i]);
        }
        
        for(auto &it : hash){
            ans.push_back(it.second);
        }
        return ans;
    }
};

哈希解法二

可以统计每个字符串里a几个,b几个…,生成一个字符串代表一类,然后放到哈希表中去重

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        std::map<std::string, std::vector<std::string>> map;
        for(auto str : strs){
            int record [26] = {0};
            for(char ch : str){
                record[ch - 'a']++;
            }
            
            std::string key;
            for(int v : record){
                key.append(std::to_string(v)).append("_");
            }
            map[key].emplace_back(str);
        }

        vector<vector<string>> ans;
        for(const auto& l : map){
            ans.emplace_back(l.second);
        }
        return ans;
    }
};

类似题目

题目思路
leetcode:49. 字母异位词分组 Group Anagrams对每一个str,先排序得到value,然后key.push_back(value) ;
leetcode:242. s是不是t的字母异位词Valid Anagrams和t均排序,如果排序号相等,那么是
leetcode: 249. 移位字符串分组 Group Shifted Strings如果s可以通过移位变成t,就是一组。可以分析出:如果s和t长度不一致,肯定无法通过移位进行转换;如果 s 和 t 长度一致,且长度为 1,则肯定可以移位转换;如果 s 和 t 长度一致且不为 1,则可以移位进行转换的判断是 s 的每一个字符都移动相同的步数变为 s(也就是说,字符串的每个字母和首字符的相对距离都是相等的)。可以遍历字典,对每一个word都映射成一个key。然后将key挂载的某个map下,最后遍历这个map,就可以得到分组了