题目描述
知识点
哈希+字符串
结果
实现
码前思考
- 一个典型的集合问题,拥有相同字符的字符串放到一个集合里面;
- **怎么来判断拥有相同字符呢?**可以对每个字符串按照字典序进行排序,一排序就可以区分了。这道题我解题的突破口就是这个排序吧。
代码实现
//先将每个单词字典序排序
//以排序后的单词生成map<string,int>
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
unordered_map<string,int> mp;
int size = strs.size();
int groupSize = 0;
for(int i=0;i<size;i++){
string str = strs[i];
string sortStr = str;
//得使用beigin()和end()
sort(sortStr.begin(),sortStr.end());
//cout<<sortStr;
int groupNum;
if(mp.count(sortStr) != 0){
groupNum = mp[sortStr];
res[groupNum].push_back(str);
}else{
mp[sortStr]=groupSize;
vector<string> tmp;
tmp.push_back(str);
res.push_back(tmp);
groupSize++;
}
}
return res;
}
};
码后反思
- 主要在于判断具有相同的字符;
- 排序字符串需要使用
begin()
和end()
;
二刷代码
二刷的时候忘记可以一边分组一边排序了。。。自己开了一个空间保存所有排序后的结果。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
//首先对每一个字符串进行排序
vector<string> sortstrs = strs;
//排序
for(int i=0;i<sortstrs.size();i++){
sort(sortstrs[i].begin(),sortstrs[i].end());
}
//然后再进行hash处理
unordered_map<string,int> mp;
vector<vector<string>> res;
int cnt=0;
for(int i=0;i<strs.size();i++){
if(mp.count(sortstrs[i])==0){
mp[sortstrs[i]]=cnt;
cnt++;
res.push_back({strs[i]});
}else{
int idx = mp[sortstrs[i]];
res[idx].push_back(strs[i]);
}
}
return res;
}
};