class Solution {
public:
int all[26]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
vector<vector<string> > answer;
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string> > vec;
map<int,int> m;
int k=0;
for(int i=0;i<strs.size();i++){
int l=strs[i].length();
if(m.find(l)==m.end()) {
m[l]=k;
vector<string> b;
b.push_back(strs[i]);
vec.push_back(b);
k++;
}
else{
vec[m[l]].push_back(strs[i]);
}
}
vector<vector<string> > answer;
int q=0;
for(int i=0;i<vec.size();i++){
map<int,int> m1;
for(int j=0;j<vec[i].size();j++){
int num=1;
for(int t=0;t<vec[i][j].length();t++) {
num = (num*all[int(vec[i][j][t]-'a')])%10000079;
}
if(m1.find(num)==m1.end()){
m1[num]=q;
vector<string> b;
b.push_back(vec[i][j]);
answer.push_back(b);
q++;
}
else{
answer[m1[num]].push_back(vec[i][j]);
}
}
}
return answer;
}
};
先分组,将一样长度的字符串分到一起,然后26个字母分别代表26个质数,乘积一样的字符串则分到一组。