改了又改,简化了又简化,还是超时。可见必须从数组本身来进行hash运算。
class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> res; int flag=0; for(int i=0;i<strs.size();i++) { for(int j=0;j<res.size();j++) { if(res[j][0].size()== strs[i].size() && f(res[j][0],strs[i])) { res[j].push_back(strs[i]); flag=1; break; } } if(flag == 0) { vector<string> t; t.push_back(strs[i]); res.push_back(t); } flag=0; } return res; } bool f(string a,string b){ int ss[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 }; long long ra=1,rb=1; for(int i=0;i<a.size();i++) { ra = ra*ss[a[i]-'a']; rb = rb*ss[b[i]-'a']; } return ra==rb; } };
原来应该这么做
vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> res; if(strs.size() == 0) return res; unordered_map<string,int> map; for(int i=0;i<strs.size();i++) { string tem(strs[i]); sort(tem.begin(),tem.end()); auto f=map.find(tem); if( f!= map.end()) { res[f->second].push_back(strs[i]); sort(res[f->second].begin(),res[f->second].end()); } else { res.push_back(vector<string>({strs[i]})); map[tem]=res.size()-1; } } return res; }
还有这样
vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<string, vector<string>> count; int i = 0; for (auto s : strs) { sort(s.begin(), s.end()); count[s].push_back(strs[i++]); } vector<vector<string>> res; for (auto n : count){ sort(n.second.begin(), n.second.end()); res.push_back(n.second); } return res; }