题目:
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
思路:
分析题目含义:字母相同的即为一个类别,期望分到一个组中并在return vec中组成一个vec
如何实现辨别是否为同一组:使用sort,如果sort后是一样的,就是同一组
如何判别这一组是否已经存在了呢?:利用hash_map来记录每一个元素属于哪一组,如果是第一次出现的组别,val = 0;下一次出现新的组别val = 1…
代码:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
int flag = 0;
unordered_map<string, int> data_table;
// ret[0].push_back("111");
for(string str : strs) // 第一次循环,将每个字符串排序后,统计各个字符串属于第几组,以flag记录
{
string temp_str = str;
sort(str.begin(),str.end());
if(data_table.count(str) <= 0){
data_table[str] = flag;
flag++;
}
data_table[temp_str] = data_table[str];
}
vector<vector<string>> ret;
// 初始化ret
for(int i =0; i< flag;i++){
vector<string> temp;
ret.push_back(temp);
}
// 搞定ret
for(string str : strs)
{
ret[data_table[str]].push_back(str);
}
return ret;
}
};
优化思路:
能否将上面的几次循环合并呢?
注意: vector在没有初始化的时候,是不能直接访问索引的;
能否在第一次循环的过程中,直接将新出现的组别初始化,并添加到ret中呢?
优化代码:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
int flag = 0;
unordered_map<string, int> data_table;
vector<vector<string>> ret;
// ret[0].push_back("111");
for(string str : strs) // 第一次循环,将每个字符串排序后,统计各个字符串属于第几组,以flag记录
{
string Original_str = str;
sort(str.begin(),str.end());
if(data_table.count(str) <= 0){ // 如果是新出现的组别
vector<string> temp_vec(1,Original_str);
ret.push_back(temp_vec);
data_table[str] = flag;
flag++;
}
else { // 如果是原始的组别
ret[data_table[str]].push_back(Original_str);
}
}
// // 初始化ret
// for(int i =0; i< flag;i++){
// vector<string> temp;
// ret.push_back(temp);
// }
// 搞定ret
// for(string str : strs)
// {
// ret[data_table[str]].push_back(str);
// }
return ret;
}
};