Medium!
題目描述:
給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。
示例:
輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
輸出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
說明:
- 所有輸入均為小寫字母。
- 不考慮答案輸出的順序。
解題思路:
這道題讓我們群組給定字符串集中所有的錯位詞(異位詞),所謂的錯位詞就是兩個字符串中字母出現的次數都一樣,只是位置不同,比如abc,bac, cba等它們就互為錯位詞,那么我們如何判斷兩者是否是錯位詞呢,我們發現如果把錯位詞的字符順序重新排列,那么會得到相同的結果,所以重新排序是判斷是否互為錯位詞的方法,由於錯位詞重新排序后都會得到相同的字符串,我們以此作為key,將所有錯位詞都保存到字符串數組中,建立key和字符串數組之間的映射,最后再存入結果res中即可。
C++解法一:
1 class Solution { 2 public: 3 vector<vector<string>> groupAnagrams(vector<string>& strs) { 4 vector<vector<string>> res; 5 unordered_map<string, vector<string>> m; 6 for (string str : strs) { 7 string t = str; 8 sort(t.begin(), t.end()); 9 m[t].push_back(str); 10 } 11 for (auto a : m) { 12 res.push_back(a.second); 13 } 14 return res; 15 } 16 };
下面這種解法沒有用到排序,提高了運算效率,我們用一個大小為26的int數組來統計每個單詞中字符出現的次數,然后將int數組轉為一個唯一的字符串,跟字符串數組進行映射,這樣我們就不用給字符串排序了。
C++解法二:
1 class Solution { 2 public: 3 vector<vector<string>> groupAnagrams(vector<string>& strs) { 4 vector<vector<string>> res; 5 unordered_map<string, vector<string>> m; 6 for (string str : strs) { 7 vector<int> cnt(26, 0); 8 string t = ""; 9 for (char c : str) ++cnt[c - 'a']; 10 for (int d : cnt) t += to_string(d) + "/"; 11 m[t].push_back(str); 12 } 13 for (auto a : m) { 14 res.push_back(a.second); 15 } 16 return res; 17 } 18 };