给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/group-anagrams
(1)
class Solution {
public:
int vis[26] = { 0 };
void dfs(int x, int n) {
if (n == 26) {
return;
}
for (int i = x; i < 1000; i++) {
bool f = 0;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
f = 1;
break;
}
}
if (!f) {
vis[n] = i;
dfs(i + 1, n + 1);
break;
}
}
}
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> v;
unordered_map<long long, vector<string>> m;
vis[0] = 2;
dfs(3, 1);
long long mod = 1e9 + 9;
for (auto x : strs) {
long long all = 1;
for (int i = 0; i < x.size(); i++) {
all = (all % mod) * (vis[x[i] - 'a'] % mod) % mod;
}
m[all].emplace_back(x);
}
for (auto x : m) {
v.emplace_back(x.second);
}
return v;
}
};
(2)
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;
}
};
(3)
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res ;
map<string, vector<string>> map ;
// 统计string的各字母频次,以频次为key直接加入队列
for (auto s : strs) {
string sts = string(26, '0') ;
for (auto c : s) ++ sts[c-'a'] ;
map[sts].emplace_back (s) ;
}
for (auto e : map) res.emplace_back(e.second) ;
return res ;
}