Given an array of strings strs
, group the anagrams together. You can return the answer in any order.
An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
Example 1:
Input: strs = ["eat","tea","tan","ate","nat","bat"] Output: [["bat"],["nat","tan"],["ate","eat","tea"]]
Example 2:
Input: strs = [""] Output: [[""]]
Example 3:
Input: strs = ["a"] Output: [["a"]]
Constraints:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
consists of lowercase English letters.
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
chars = defaultdict(list)
for s in strs:
k = ''.join(sorted(list(s)))
chars[k].append(s)
return list(chars.values())
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> chars = new HashMap<>();
for (String s : strs) {
char[] t = s.toCharArray();
Arrays.sort(t);
String k = new String(t);
chars.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
}
return new ArrayList<>(chars.values());
}
}
function groupAnagrams(strs: string[]): string[][] {
let map = new Map();
for (let str of strs) {
let arr = str.split('');
arr.sort();
let key = arr.join('');
let value = map.get(key) ? map.get(key) : [];
value.push(str);
map.set(key, value);
}
return Array.from(map.values());
}
function groupAnagrams(strs: string[]): string[][] {
const map = new Map<string, string[]>();
for (const str of strs) {
const k = str.split('').sort().join('');
map.set(k, (map.get(k) ?? []).concat([str]));
}
return [...map.values()];
}
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> chars;
for (auto s : strs) {
string k = s;
sort(k.begin(), k.end());
chars[k].emplace_back(s);
}
vector<vector<string>> res;
for (auto it = chars.begin(); it != chars.end(); ++it) {
res.emplace_back(it->second);
}
return res;
}
};
func groupAnagrams(strs []string) [][]string {
chars := map[string][]string{}
for _, s := range strs {
key := []byte(s)
sort.Slice(key, func(i, j int) bool {
return key[i] < key[j]
})
chars[string(key)] = append(chars[string(key)], s)
}
var res [][]string
for _, v := range chars {
res = append(res, v)
}
return res
}
use std::collections::HashMap;
impl Solution {
pub fn group_anagrams(strs: Vec<String>) -> Vec<Vec<String>> {
let mut map = HashMap::new();
for s in strs {
let key = {
let mut arr = s.chars().collect::<Vec<char>>();
arr.sort();
arr.iter().collect::<String>()
};
let val = map.entry(key).or_insert(vec![]);
val.push(s);
}
map.into_iter().map(|(_, v)| v).collect()
}
}