实际上是一个字符计数的比较问题。先从字符数量,然后从字符按照顺序的大小,以及该字符的数量来比较。
bool operator<( map<char,int> &a, map<char,int> &b){
if(a.size()!=b.size())
return a.size()<b.size();
for(auto akv:a){
if(b.count(akv.first)==0)
return true;
if(akv.second!=b[akv.first])
return akv.second<b[akv.first];
}
return true;
}
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
map<map<char,int>,vector<string>> record;
for(string &s:strs){
map<char,int> char_count;
for(char c:s){
char_count[c]++;
}
if(record.count(char_count)==0)
record[char_count]=vector<string>();
record[char_count].push_back(s);
}
vector<vector<string>> ans;
for(auto &kv:record){
ans.push_back(kv.second);
}
return ans;
}
};
把字符串排序,把字符顺序都从小到大,然后通过字符串比较,来解决字符计数的比较问题。这样更快。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>> record;
for(string &s:strs){
string key(s);
sort(key.begin(),key.end());
if(record.count(key)==0)
record[key]=vector<string>();
record[key].push_back(s);
}
vector<vector<string>> ans;
for(auto &kv:record){
ans.push_back(kv.second);
}
return ans;
}
};