题目:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 10000
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母
思路一:哈希表+排序,我们知道每个异位词是长度、字符相同,但是顺序不同;我们可以建立一个map数组,将排完序的字符串作为key值,而原来的strs数组是value值,如果strs排完序相同的,都是同一个key值,所以返回的也是一个异位词数组。
思路二:暴力解法,我们建立一个string容器vet,用来装排完序的strs字符串,vet和strs数组的区别就是每个字符串的字母顺序不同,但是下标相同。用两个for()把vet字符串数组相同元素的push_back()在二维string数组path中,最后直接返回path数组。
思路一完整代码:
class Solution
{
public:
vector<vector<string>> groupAnagrams(vector<string> &strs)
{
unordered_map<string,vector<string>>mymap;
vector<vector<string>>ans;
for(int i=0;i<strs.size();i++)
{
string st=strs[i];
sort(st.begin(),st.end());
mymap[st].push_back(strs[i]);
}
for(unordered_map<string,vector<string>>::iterator it=mymap.begin();it!=mymap.end();it++)
{
ans.push_back(it->second);
}
return ans;
}
};
思路二完整代码:
class Solution
{
public:
vector<vector<string>> groupAnagrams(vector<string> &strs)
{
vector<string> vets;
vector<string> vs;
vector<vector<string>>path;
for(int i=0;i<strs.size();i++)
{
string str=strs[i];
sort(str.begin(),str.end());
vets.push_back(str); //其实这里就相当于用两个数组表示map的底层原理。
}
for(int i=0;i<vets.size();i++)
{
vs.push_back(strs[i]);
for(int j=0;j<vets.size();j++)
{
if(vets[i]==vets[j]&&i!=j)
{
vs.push_back(strs[j]);
}
}
sort(vs.begin(),vs.end()); //因为两个for()中有重复的添加元素,所以直接按顺序存放在path数组中,为了下面的path.erase()
path.push_back(vs);
vs.clear(); //每次vs的情况都是为了数据溢出
}
sort(path.begin(),path.end());
path.erase(unique(path.begin(),path.end()),path.end());
return path;
}
};
本道题的思路就是这样了!