題目:
給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。
示例:
輸入: ["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;
}
};