49.Group Anagrams
给定一个字符串容器,对这些字符串进行分类,是字符的分为一类,返回分类结果。
Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
思路:
暴力法,此题是easy-242题 Valid Anagram 的升级版,将容器中的字符串遍历,并将每一个字符串与模板中的比较,若和模板中的字符串成为字谜,则将其加入到结果中,否则,添加到模板中,而在于模板中保存的模板挨个比较的时候,就用到了242题判断连个字符串是否是字谜的方法。虽然能AC,但是很慢,只比5%的提交快。
class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> res; vector<string> tmplate; for (int i = 0; i < (int)strs.size(); i++) {//遍历容器中的字符串 bool flag = false; string tmp_s = strs[i]; for (int j = 0; j < (int)tmplate.size(); j++) {//遍历模板容器 if (tmplate[j].size() != tmp_s.size()) continue;//首先判断长度是否一样 flag = true; int tmp[26] = { 0 }; //开始比较两个字符串是否成为字谜 for (int k = 0; k < (int)tmp_s.size(); k++) { tmp[tmplate[j][k] - 'a'] += 1; tmp[tmp_s[k] - 'a'] -= 1; } for (auto a : tmp) { if (a != 0) { flag = false; break; } } if (flag) { res[j].push_back(tmp_s); break; }//若是字谜,则加入到结果中 } if (flag == false) {//与模板中都不成为字谜,或者模板为空,则添加当前字符串到模板中 tmplate.push_back(tmp_s); res.push_back({ tmp_s }); } } return res; } };
二、将字谜都转为字母 + 出现个数的组合,比如:“ate”/"tea" 都转为“a1e1t1”,这对于不同的字谜,具有绝对区分度。再利用哈希字典存储字符串容器。
class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> res; unordered_map<string, vector<string>> map; for (int i = 0; i < (int)strs.size(); i++) { string tmp; int a[26] = { 0 }; for (auto c : strs[i]) a[c - 'a'] += 1; for (int j = 0; j < 26; j++) { if (a[j] == 0) continue; tmp += string(1, 'a' + j) + to_string(a[j]); } map[tmp].push_back(strs[i]); } for (auto item : map) res.push_back(item.second); return res; } };
Java 版:
class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String, List<String>> map = new HashMap<>(); for(String s : strs){ int[] tmp = new int[26]; for(int i = 0; i < s.length(); i++){ tmp[s.charAt(i) - 'a']++; } String key = ""; for(int i = 0; i < 26; i++){ if(tmp[i] > 0) key = key + tmp[i] + (char)(i + 'a'); } if(map.containsKey(key)){ List<String> tmpString = map.get(key); tmpString.add(s); }else map.put(key, new ArrayList<String>(Arrays.asList(s))); } return new ArrayList<>(map.values()); } }