给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母//290ms //将字符串排序 e.g.bab->abb,然后遍历比较 class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<string> sortStrs=strs; vector<int> flag(strs.size(),0); vector<vector<string>> res; int k=-1; int m; for(int i=0;i<sortStrs.size();i++){ sort(sortStrs[i].begin(),sortStrs[i].end()); } for(int i=0;i<sortStrs.size();i++){ if(flag[i]==1) continue; flag[i]=1; m=0; res.push_back(vector<string>()); res[res.size()-1].push_back(strs[i]); for(int j=i+1;j<sortStrs.size();j++){ if(sortStrs[j]==sortStrs[i]){ flag[j]=1; res[res.size()-1].push_back(strs[j]); } } } return res; } };
//官方题解 //24ms //哈希表 bab—>abb,abb作为键 class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<string, vector<string>> mp; for (string& str: strs) { string key = str; sort(key.begin(), key.end()); mp[key].emplace_back(str); } vector<vector<string>> ans; for (auto it = mp.begin(); it != mp.end(); ++it) { ans.emplace_back(it->second); } return ans; } };
//23ms //依旧是哈希表,键为26长度的数组,该数组记录了一个字符串字母的出现次数 class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { // 自定义对 array<int, 26> 类型的哈希函数 auto arrayHash = [fn = hash<int>{}] (const array<int, 26>& arr) -> size_t { return accumulate(arr.begin(), arr.end(), 0u, [&](size_t acc, int num) { return (acc << 1) ^ fn(num); }); }; unordered_map<array<int, 26>, vector<string>, decltype(arrayHash)> mp(0, arrayHash); for (string& str: strs) { array<int, 26> counts{}; int length = str.length(); for (int i = 0; i < length; ++i) { counts[str[i] - 'a'] ++; } mp[counts].emplace_back(str); } vector<vector<string>> ans; for (auto it = mp.begin(); it != mp.end(); ++it) { ans.emplace_back(it->second); } return ans; } };