1 #include "000库函数.h" 2 3 4 //笨方法,循环,遍历 5 //先将每个字母进行遍历,并给排序,这样就可以确定出有几种字符串,然后就可以开辟空间了 6 //然后给每个字符串进行找位子 7 //笨方法,时间久 864ms ,内存大17.4M 8 class Solution { 9 public: 10 vector<vector<string>> groupAnagrams(vector<string>& strs) { 11 vector<vector<string>>Res; 12 vector<string>st; 13 set<string>s; 14 for (auto a : strs) { 15 sort(a.begin(), a.end());//给每个字符排序 16 s.insert(a);//去除相同字母的组合 17 } 18 st.assign(s.begin(), s.end());//将不相同的字符串储存下来 19 Res.resize(s.size());//给Res开辟空间 20 21 for (auto a : strs) { 22 auto b = a; 23 sort(b.begin(), b.end());//给每个字符排序 24 for (int i = 0; i < st.size(); ++i) 25 if (st[i] == b) 26 Res[i].push_back(a); 27 } 28 return Res; 29 30 } 31 }; 32 33 //思路和上面一样,代码简便点,减少了循环次数 34 class Solution { 35 public: 36 vector<vector<string>> groupAnagrams(vector<string>& strs) { 37 vector<vector<string>> res; 38 unordered_map<string, int> mp; 39 for (int i = 0, j = 0; i < strs.size(); i++) { 40 string st = strs[i]; 41 sort(st.begin(), st.end()); 42 if (mp.find(st) != mp.end()) { 43 res[mp[st]].push_back(strs[i]); 44 } 45 else { 46 vector<string> tmp{ strs[i] }; 47 res.push_back(tmp); 48 mp[st] = j++; 49 } 50 } 51 return res; 52 } 53 }; 54 55 //用字典最好 56 class Solution { 57 public: 58 vector<vector<string>> groupAnagrams(vector<string>& strs) { 59 vector<vector<string>> res; 60 unordered_map<string, vector<string>> m; 61 for (string str : strs) { 62 string t = str; 63 sort(t.begin(), t.end()); 64 m[t].push_back(str); 65 } 66 for (auto a : m) { 67 res.push_back(a.second); 68 } 69 return res; 70 } 71 }; 72 73 74 //下面这种解法没有用到排序,我们用一个大小为26的int数组来统计每个单词中字符出现的次数, 75 //然后将int数组转为一个唯一的字符串,跟字符串数组进行映射,这样我们就不用给字符串排序了, 76 //代码如下: 77 class Solution { 78 public: 79 vector<vector<string>> groupAnagrams(vector<string>& strs) { 80 vector<vector<string>> res; 81 unordered_map<string, vector<string>> m; 82 for (string str : strs) { 83 vector<int> cnt(26, 0); 84 string t = ""; 85 for (char c : str) ++cnt[c - 'a']; 86 for (int d : cnt) t += to_string(d) + "/";//将数字转换为字母,与相面思想类似,t即为排了序的字符串 87 m[t].push_back(str); 88 } 89 for (auto a : m) { 90 res.push_back(a.second); 91 } 92 return res; 93 } 94 }; 95 96 void T049() { 97 Solution s; 98 vector<vector<string>>Res; 99 vector<string>v; 100 v = { "eat", "tea", "tan", "ate", "nat", "bat" }; 101 Res = s.groupAnagrams(v); 102 for (auto &a : Res) { 103 for (auto b : a) 104 cout << b << " "; 105 cout << endl; 106 } 107 }