LeetCodeDay37|LeetCodeDay37 —— 字母异位词分组★★★

49. 字母异位词分组 描述

  • 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例
输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ] 说明: 所有输入均为小写字母。 不考虑答案输出的顺序。

思路
  1. 暴力解法,将字符串数组中的字符串两两比较,相同的放在同一个Vector中
  2. 利用容器Map>, 将字符串String排序后作 Key, 同 Key 的字符串放在一个桶内。
// 超时算法 class Solution_49_OverTime { public: vector groupAnagrams(vector& strs) { vector ret; vector isTag; isTag.assign(strs.size(), false); for (int i = 0; i < strs.size(); ++i) { if (isTag[i]) continue; vector tmp; tmp.push_back(strs[i]); for (int j = i + 1; j < strs.size(); ++j) { if (isAnagram(strs[i], strs[j])) { tmp.push_back(strs[j]); isTag[j] = true; } } ret.push_back(tmp); } return ret; } bool isAnagram(string s1, string s2) { sort(s1.begin(), s1.end()); sort(s2.begin(), s2.end()); return s1 == s2; } }; // 错误的思路,字符和加位数并不能唯一确定字符串,如ac和bb class Solution_49_Error { public: vector groupAnagrams(vector& strs) { vector ret; unordered_map hash; vector weight; // 计算出每个字符串的权值 for (string str : strs) { int tmp = 0; for (char ch : str) { tmp += ch - 'a'; } weight.push_back(tmp * 10 + str.size()); } // 根据权重分配异位词 for (int i = 0; i < strs.size(); ++i) { auto iter = hash.find(weight[i]); if (iter == hash.end()) { hash[weight[i] = ret.size(); ret.push_back({strs[i]}); } else { ret[iter->second].push_back(strs[i]); } } return ret; } }; // string 作 key, 将对应的字符串放入数组中 class Solution_49 { public: vector groupAnagrams(vector& strs) { vector ret; unordered_map> mp; for(const string& str : strs){ string t = str; sort(t.begin(), t.end()); mp[t].push_back(str); } for(const auto& val : mp){ ret.push_back(val.second); } return ret; } };

    推荐阅读