最开始的想法是创建vector<vector<string>> result,然后遍历strs中字符串,遍历result中vector,比较vector中第一个string和strs中string,若为字母异位词,则加入vector,若无,则创建新的vetcor加入result……
判断字母异位词的方法是建立长度为24,初始化全为0的string,每有一字母就将对应位置加一……(后来才发现有每个字母数量不能大于9的bug)
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> result;
int n=strs.size();
for(int i=0;i<n;i++){
int m=result.size();
int j=0;
for(j;j<m;j++){
vector<string> a=result[j];
if(equal(a[0],strs[i])){
result[j].push_back(strs[i]);
break;
}
}
if(j==m){
vector<string> ss;
ss.push_back(strs[i]);
result.push_back(ss);
}
}
return result;
}
bool equal(string s1,string s2){
int n1=s1.size();
int n2=s2.size();
if(n1!=n2) return 0;
string ss1(25,'0');
for(int i=0;i<n1;i++){
ss1[s1[i]-97]++;
}
string ss2(25,'0');
for(int i=0;i<n2;i++){
ss2[s2[i]-97]++;
}
if(ss1==ss2) return 1;
else return 0;
}
};
结果是时间超限,看了答案才知道有更好的方法,那就是用map,判断字母异位词也可以直接对string使用sort后进行比较,简洁很多
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>> mp;
int n=strs.size();
for(int i=0;i<n;i++){
string str=strs[i];
sort(str.begin(),str.end());
mp[str].push_back(strs[i]);
}
vector<vector<string>> result;
for(auto i=mp.begin();i!=mp.end();i++){
result.push_back(i->second);
}
return result;
}
};