思路:
1.看到这个题,基本就可以想到和哈希表有关系的了。
现在要解决的就是怎么映射的问题。
2.发现异位词只是顺序不同,而构成的字母都一样,那么,可不可以找个共同属性,当做哈希表的key,这样在key相同的情况下就可以完成对应关系了。
可能有些人会想asc值相同会不会是一类异构词,可惜不是,比如abd和bcd就是asc值相同但是不互为异构,
3.这里,可以往字符串当做key的方向想,既然都是相同字母组成的串,那么如果给它一个规则让每个异构串按特定属性排列一下,然后我们拿这个排列好的串当做key值,那么不就实现了异构串拥有相同key的目的了吗?对,直接备份一下每个string,然后sort一下,把sort好的串当做key,作映射,就完成了哈希表的对应关系了。
4.补充一下,我们备份完每个串,进行sort排序后,用find去找有没有存下过这类异构词,如果存下过,那么直接push_back在对应行的后面就行了,如果find发现没存过,就新开一行存就行了(输出数组可以看成一个以string为元素,vector为行列的二维数组)。
代码如下:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
int len = strs.size();
if(len==0) return {{""}};
std::map<string,int> mymap;
vector<vector<string>> ans;
int cur = 0;
for(int i=0;i<len;i++)
{
string tmp(strs[i]);
sort(tmp.begin(),tmp.end());
std::map<string,int>::iterator it = mymap.find(tmp);
if(it!=mymap.end())
{
ans[it->second].push_back(strs[i]);
}
else
{
vector<string> item;
item.push_back(strs[i]);
ans.push_back(item);
mymap.insert(make_pair(tmp,cur));
cur++;
}
}
return ans;
}
};