题意理解:
将给定字符串分组,要求同一组的字符串由相同字符组成,最终,将各组字符串按字典序输出;
题目分析:
1. 将字符串先进行排序,然后通过字符串比较来判定是否为同一组;
2. 将分组后的字符串集合再进行排序,从而满足题目的字典序要求;
3. 在分组的过程中需要进行查找,本题中使用了hash的思想,但C++的STL中没有hash容器,解题代码中使用map来完成hash功能(map由红黑数实现,效率比很实的hash_map效率低);
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ans;
if(strs.empty()) return ans;
//sort(strs.begin(),strs.end());
map<string,vector<string>> dict;
int len=strs.size();
for(int i=0;i<=len-1;i++)
{
string tmp=strs[i];
sort(tmp.begin(),tmp.end());
dict[tmp].push_back(strs[i]);
}
for(map<string,vector<string>>::iterator it=dict.begin();it!=dict.end();it++)
{
vector<string> tmp2(it->second);
sort(tmp2.begin(),tmp2.end());
ans.push_back(tmp2);
}
return ans;
}
};
另外的方法。在最开始处理之前对原数据集进行字典序排序,保证最后结果的每一个vector中string都是字典序。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
if (strs.empty())
return vector<vector<string> >();
int len = strs.size();
//将字符串数组按照字典顺序排序
sort(strs.begin(), strs.end());
//存储结果
vector<vector<string> > ret;
//利用哈希思想构建map,将排序后相等的字符串存在相应的vector
map<string, vector<string>> mv;
for (int i = 0; i < len; i++)
{
string str = strs[i];
sort(str.begin(), str.end());
mv[str].push_back(strs[i]);
}
for (map<string, vector<string> >::iterator iter = mv.begin(); iter != mv.end(); iter++)
ret.push_back(iter->second);
return ret;
}
};