力扣49. 字母异位词分组 C++ (计数/排序)

法一:计数

思路:

统计每个字符串中不同字符出现的个数,将情况相同的字符串存在同一个哈希表中。

代码实现:

public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>>res;
        unordered_map<string,vector<string>>mp;
        for(auto &str : strs){//遍历字符串数组的每个字符串str
            string s=string(26,'0');//新建字符串s
            for(auto &c:str){//用s记录str的各字符个数
                s[c-'a']++; 
            }
            mp[s].push_back(str);//以s为键,存异位词组
        }
        for(auto &c:mp){//
                res.push_back(c.second);
            }
        return res;
    }
};

注://使用引用&可以更改字符的值,值不改变时可不加(题中)。

法二:排序

思路:

由于互为变位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。

代码实现:

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string,vector<string> >map;//键为字符串,值为其多个字母异位词
        for(string  &s:strs){
            string t=s;
            sort(t.begin(),t.end());
            map[t].push_back(s);
        }
        vector<vector<string>>res;
        for(auto n:map){
            res.push_back(n.second);
        }
        return res;
    }
};

你可能感兴趣的:(c++)