阿克蘇網(wǎng)站建設(shè)百度權(quán)重5的網(wǎng)站能賣多少錢
2.字母異位詞分組
題目描述:
給你一個字符串?dāng)?shù)組,請你將?字母異位詞?組合在一起??梢园慈我忭樞蚍祷亟Y(jié)果列表。
字母異位詞?是由重新排列源單詞的所有字母得到的一個新單詞。
示例 1:
輸入: strs =
["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:
[["bat"],["nat","tan"],["ate","eat","tea"]]
給定的是vector<string>類型的容器,輸出的是vector<vector<string>>類型的容器。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string,vector<string>> anagrams;for(const string& str:strs){string sortedstr = str;sort(sortedstr.begin(),sortedstr.end());anagrams[sortedstr].emplace_back(str);}vector<vector<string>> result;for(const auto&pair:anagrams){result.emplace_back(pair.second);}return result;
}
};
實(shí)現(xiàn)邏輯:使用for循環(huán)遍歷strs,對每一個strs[i]對應(yīng)的單詞進(jìn)行sort排序,如tea和eat都會被排序?yàn)閍et,對每個單詞排序后的結(jié)果作為鍵,如果該鍵不存在于哈希表中,則創(chuàng)建新元素<key,value>,如果鍵已存在,則將新單詞加入鍵所對應(yīng)的vector中,比如開始遍歷實(shí)例中給的vector容器時,eat和tea經(jīng)過排序后,都對應(yīng)aet這個鍵,遍歷eat時,哈希表中開始創(chuàng)建了<aet,{eat}>,當(dāng)遍歷到tea時,哈希表就成了<aet,{eat,tea}>。而后再對遍歷完所有strs后的哈希表進(jìn)行遍歷,將其所有元素中存在的值都加入result中,最后result就會成為[["bat"],["nat","tan"],["ate","eat","tea"]]的形式,那么只需返回result就行。
代碼解釋:
unordered_map<string,vector<string>> anagrams;創(chuàng)建string,vector<string>類型的哈希表anagrams;
for(const string& str:strs)使用for循環(huán)對strs中的每一個元素都取別名,const string& str:strs是C++中對容器元素進(jìn)行遍歷的代碼。
sort(sortedstr.begin(),sortedstr.end());使用sort對sortedstr進(jìn)行排序,這里是把sortedstr也當(dāng)作了一個容器,不過是char類型,按照begin()和end()迭代器作為sort的起始和終結(jié)條件。如果sortedstr對應(yīng)eat,排序后,它就成為aet。
anagrams[sortedstr].emplace_back(str);,按照鍵:sortedstr往哈希表中插入元素str,其實(shí)此時sortedstr也就是str所對應(yīng)的排序好后的鍵,string sortedstr = str;這也就是為什么要加這一句代碼。
----anagrams[sortedstr]:首先嘗試在 anagrams 哈希表中查找鍵為 sortedstr 的元素。如果找到,則返回該鍵對應(yīng)的 vector<string>;如果沒有找到,則會創(chuàng)建一個新的 vector<string> 并將其與 sortedstr 鍵關(guān)聯(lián)起來,然后返回這個新的向量。
----.emplace_back(str):這是在向由 anagrams[sortedstr] 返回的向量中添加元素的一種方式。emplace_back() 方法與push_back() 方法類似,都是向容器末尾添加元素。但是,emplace_back() 更加高效,因?yàn)樗窃谌萜鞯哪┪仓苯訕?gòu)造對象,而不是先創(chuàng)建對象再復(fù)制或移動它進(jìn)入容器。這意味著如果 emplace_back() 的參數(shù)正好匹配要插入元素的構(gòu)造函數(shù)參數(shù),則可以直接在容器的存儲空間上進(jìn)行構(gòu)造,避免不必要的拷貝或移動操作。
unordered_map<string,vector<string>>? 類型的容器 anagrams。這里的pair?實(shí)際上代表 anagrams 中的每一個鍵值對(即每一個元素),其中 pair.first 對應(yīng)鍵(在這個場景下是排序后的字符串),而 pair.second 對應(yīng)值(即一組異位詞組成的 vector<string>)。比如經(jīng)過前面的代碼,那么anagrams中元素的存在形式可能是這樣的?[{abt,["bat"]},{ant,["nat","tan"]},{aet,["ate","eat","tea"]}],那么每一次遍歷pair.second就對應(yīng)著["bat"]、["nat","tan"]、["ate","eat","tea"]這幾個容器。,而后將其插入至result中。
最后將result返回即可。