题目:题目链接
题目大意就是看哪些单词出现的字母一样,如果是就把他们放一起,不管其字母出现的顺序是否一样。
思路:用map记录下单词的字符串(是排序后的)。也就是说我们对于两个单词 acb和bac,把acb,bac排序,它们就都是abc,使用我们只需要记录abc出现就可以了。注意我们需要输出原单词,所以先用个中间变量保存单词再排序,这样原单词就不变了。看代码吧:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
int len = strs.size();
vector<vector<string>> ans(len);
unordered_map<string, int>unmp;//记录字符出现的位置
int k = 0;//当前使用的ans大小
for (auto& str : strs) {
string tmp = str;
sort(tmp.begin(), tmp.end());//按照字典序排序,不管是abc,还是bac,排序后都是abc,把abc记录到unmp中
if (unmp.find(tmp) == unmp.end()) {//找不到,说明从未出现
ans[k].push_back(str);//把原始的str放到答案中
unmp[tmp] = k;//标记为出现
k++;
}
else ans[unmp[tmp]].push_back(str);//存在就直接加入就可以
}
ans.resize(k);//把多余的部分截断,因为初始大小是len,但合并之后实际使用大小可能会小于len
return ans;
}
};
也可以再优化一下,不需要截断。因为只有执行if才需要开辟新空间嘛。所以:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ans;
unordered_map<string, int>unmp;//记录字符出现的位置
int k = 0;//当前使用的ans大小
for (auto& str : strs) {
string tmp = str;
sort(tmp.begin(), tmp.end());//按照字典序排序,不管是abc,还是bac,排序后都是abc,把abc记录到unmp中
if (unmp.find(tmp) == unmp.end()) {//找不到,说明从未出现
ans.push_back(vector<string>{str});//把原始的str放到答案中
unmp[tmp] = k;//标记为出现
k++;
}
else ans[unmp[tmp]].push_back(str);//存在就直接加入就可以
}
return ans;
}
};
可以找找茬,其实就是修改了预先给ans分配len大小还有if中直接push_back的操作,最后用于截断的resize自然也不需要了。
加油加油!!加油加油加油!!!加油哦!!