知识点

哈希

思路

首先统计每个字符串的每个字符的个数,如果两个字符串是同一类的,那么这个26个数所表示的状态就是一样的。因此我们只需要用一个哈希表来记录相同状态有哪些字符串再连接即可。

实现上有两点,一是由于没有现成的哈希函数,unordered_map用不了,可以用map代替。第二点就是输出的格式很麻烦,要的是同一状态的字符串用逗号连接起来的结果中按字典序排序的结果。

AC Code(C++)

#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param strs string字符串vector 
     * @return string字符串vector
     */
    using ai26 = array<int, 26>;
    vector<string> groupAnagrams(vector<string>& strs) {
        map<ai26, vector<string>> mp;
        for (auto& s : strs) {
            mp[get(s)].push_back(s);
        }
        vector<string> keys;
        for (auto& [k, v] : mp) {
            keys.push_back(v[0]);
        }
        sort(keys.begin(), keys.end());
        vector<string> res;
        for (auto& k : keys) {
            auto& vec = mp[get(k)];
            res.push_back(join(vec));
        }
        return res;
    }
    ai26 get(string& s) {
        ai26 res{};
        for (auto c : s) {
            res[c - 'a'] += 1;
        }
        return res;
    }
    string join(vector<string>& v) {
        string s = v[0];
        for (int i = 1; i < v.size(); i ++) {
            s += ',';
            s += v[i];
        }
        return s;
    }
};