題目鏈接:49. 字母異位詞分組 - 力扣(LeetCode)
題目描述
給你一個字符串數組,請你將?字母異位詞?組合在一起。可以按任意順序返回結果列表。
示例 1:
輸入:?strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:?[["bat"],["nat","tan"],["ate","eat","tea"]]
解釋:
- 在 strs 中沒有字符串可以通過重新排列來形成?
"bat"
。 - 字符串?
"nat"
?和?"tan"
?是字母異位詞,因為它們可以重新排列以形成彼此。 - 字符串?
"ate"
?,"eat"
?和?"tea"
?是字母異位詞,因為它們可以重新排列以形成彼此。
示例 2:
輸入:?strs = [""]
輸出:?[[""]]
示例 3:
輸入:?strs = ["a"]
輸出:?[["a"]]
?題目作答
?解題的第一步是要找到一個對應關系,要將具有相同字母的放入到一個集合里,然后就可以根據這個集合的名字再取出集合里面的元素,也就是有相同字母但是不同序的單詞。
利用map可以很好的找到對應關系,key就是具有相同字母的組合,map.second就是存放所有相同字母但是不同序的單詞。
我們可以使用一個哈希表(?std::unordered_map
),其中:
Key?是每個字符串排序后的結果。
Value?是一個字符串列表(vector<string>
),用來存放所有能生成這個鍵的原始字符串。
Key:我們需要為每個字符串生成一個唯一的標識,這個標識對于所有字母異位詞來說都應該是相同的。一個非常直觀有效的方法是對字符串的字符進行排序。無論原始順序如何,"eat"
, "tea"
, "ate"
在排序后都會得到同一個字符串:"aet"
。同樣,"tan"
和 "nat"
排序后都會得到 "ant"
。這個排序后的字符串 "aet"
或 "ant"
就可以作為它們共同的“鍵”。
vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> map;for (string str : strs) {string key = str;sort(key.begin(), key.end());// 使用排序后的 `key` 作為哈希表的鍵,// 將原始的、未排序的字符串 `str` 添加到該鍵對應的值中。map[key].push_back(str);}// 存放返回結果vector<vector<string>> result;for (auto pair : map) {// pair.first 是鍵// pair.second 是值(如 ["eat", "tea", "ate"])result.push_back(pair.second);}return result;}
?