自己的答案
class Solution { public:std::map<char,int> GetStringMap(string msg_){std::map<char,int> charMap;for(char c : msg_){charMap[c]++;}// std::cout<< "单词组成: "<< msg_ << " || "; // for(auto &pair:charMap){// std::cout<<pair.first <<'/' <<pair.second << " " ;// }// std::cout << std::endl;return charMap;}vector<vector<string>> groupAnagrams(vector<string>& strs) {std::multimap<std::map<char,int>, std::string> m_map;// for (const auto& element : vec) {// std::cout << element << " ";// }for (auto i=0;i< strs.size();++i){string mgs_=strs[i];std::map<char,int> map_i = GetStringMap(mgs_);auto it= m_map.find(map_i);// if(it !=m_map.end()){// std::cout<< "存在" <<std::endl;// }// else{// std::cout<< "不存在" <<std::endl;// }// m_map.insert(std::make_pair(map_i,mgs_));m_map.insert({map_i,mgs_});}//std::multimap<std::map<char,int>, std::string> m_map;std::vector<std::vector<string>> result;for(auto mmap_i = m_map.begin(); mmap_i != m_map.end();){// for( auto &mmap_i : m_map){//std::cout<< "字符:"<< mmap_i.second <<std::endl;auto range = m_map.equal_range(mmap_i->first);std::vector<string> i_string;for (auto rangeIt = range.first; rangeIt != range.second; ++rangeIt) {//std::cout<< "字符:"<< rangeIt->second <<' ';i_string.push_back(rangeIt->second);}// std::cout <<std::endl;result.push_back(i_string);mmap_i=range.second;}return result;} };
官方答案 1排序
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;} };作者:力扣官方题解 链接:https://leetcode.cn/problems/group-anagrams/solutions/520469/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二:计数
由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。
由于字符串只包含小写字母,因此对于每个字符串,可以使用长度为 26 的数组记录每个字母出现的次数。需要注意的是,在使用数组作为哈希表的键时,不同语言的支持程度不同,因此不同语言的实现方式也不同。
作者:力扣官方题解
链接:https://leetcode.cn/problems/group-anagrams/solutions/520469/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
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;} };作者:力扣官方题解 链接:https://leetcode.cn/problems/group-anagrams/solutions/520469/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。