改了又改,简化了又简化,还是超时。可见必须从数组本身来进行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;
}
浙公网安备 33010602011771号