给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:

所有输入均为小写字母。
不考虑答案输出的顺序。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

方法一:排序数组分类
思路

当且仅当它们的排序字符串相等时,两个字符串是字母异位词。

算法

维护一个映射 ans : {String -> List},其中每个键 \text{K}K 是一个排序字符串,每个值是初始输入的字符串列表,排序后等于 \text{K}K。

方法二:按计数分类
思路

当且仅当它们的字符计数(每个字符的出现次数)相同时,两个字符串是字母异位词。

算法

我们可以将每个字符串 \text{s}s 转换为字符数 \text{count}count,由26个非负整数组成,表示 \text{a}a,\text{b}b,\text{c}c 的数量等。我们使用这些计数作为哈希映射的基础。

在 Java 中,我们的字符数 count 的散列化表示将是一个用 字符分隔的字符串。 例如,abbccc 将表示为 #1#2#3#0#0#0 …#0,其中总共有26个条目。 在 python 中,表示将是一个计数的元组。 例如,abbccc 将表示为 (1,2,3,0,0,…,0),其中总共有 26 个条目。

作者:LeetCode
链接:https://leetcode-cn.com/problems/two-sum/solution/zi-mu-yi-wei-ci-fen-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码

class Solution {
   
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
   
        vector<vector<string>> ans;
        map<string, vector<string>> hash;
        for (string str : strs) {
   
            string tmp = str;
            sort(tmp.begin(), tmp.end());
            hash[tmp].push_back(str);
        }
        for (auto it : hash) {
   
            ans.push_back(it.second);
        }
        return ans;
    }
};

总结

排序后插入是一种办法,或者通过设计hash函数,就类似解法二的思路,
不同解法二是设计了另一种信息的表示形式。