Medium!
题目描述:
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
解题思路:
这道题让我们群组给定字符串集中所有的错位词(异位词),所谓的错位词就是两个字符串中字母出现的次数都一样,只是位置不同,比如abc,bac, cba等它们就互为错位词,那么我们如何判断两者是否是错位词呢,我们发现如果把错位词的字符顺序重新排列,那么会得到相同的结果,所以重新排序是判断是否互为错位词的方法,由于错位词重新排序后都会得到相同的字符串,我们以此作为key,将所有错位词都保存到字符串数组中,建立key和字符串数组之间的映射,最后再存入结果res中即可。
C++解法一:
1 class Solution { 2 public: 3 vector<vector<string>> groupAnagrams(vector<string>& strs) { 4 vector<vector<string>> res; 5 unordered_map<string, vector<string>> m; 6 for (string str : strs) { 7 string t = str; 8 sort(t.begin(), t.end()); 9 m[t].push_back(str); 10 } 11 for (auto a : m) { 12 res.push_back(a.second); 13 } 14 return res; 15 } 16 };
下面这种解法没有用到排序,提高了运算效率,我们用一个大小为26的int数组来统计每个单词中字符出现的次数,然后将int数组转为一个唯一的字符串,跟字符串数组进行映射,这样我们就不用给字符串排序了。
C++解法二:
1 class Solution { 2 public: 3 vector<vector<string>> groupAnagrams(vector<string>& strs) { 4 vector<vector<string>> res; 5 unordered_map<string, vector<string>> m; 6 for (string str : strs) { 7 vector<int> cnt(26, 0); 8 string t = ""; 9 for (char c : str) ++cnt[c - 'a']; 10 for (int d : cnt) t += to_string(d) + "/"; 11 m[t].push_back(str); 12 } 13 for (auto a : m) { 14 res.push_back(a.second); 15 } 16 return res; 17 } 18 };