给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
Java解法:暴力统计
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<Character,Integer>[] maps = new Map[strs.length];
Set<Map<Character,Integer>> set = new HashSet<>();
for(int i = 0;i < strs.length;i++){
maps[i] = statistics(strs[i]);
}
int index = 0;
List<List<String>> res = new ArrayList<>();
while (index < strs.length){
if(set.contains(maps[index])){
index++;
continue;
}
List<String> temp = new ArrayList<>();
set.add(maps[index]);
temp.add(strs[index]);
for(int i = index + 1;i < strs.length;i++){
if(maps[index].equals(maps[i])){
temp.add(strs[i]);
}
}
res.add(temp);
}
return res;
}
public Map<Character,Integer> statistics(String str){
Map<Character,Integer> map = new HashMap<>();
for(int i = 0;i < str.length();i++){
if(!map.containsKey(str.charAt(i))){
map.put(str.charAt(i),1);
}else {
int temp = map.get(str.charAt(i));
map.put(str.charAt(i),temp+1);
}
}
return map;
}
}
结果:
js解法:
方法一:暴力统计
var groupAnagrams = function(strs) {
//解题思路:统计法
//用map对每个字符串进行统计
let map = new Map()
for (let i = 0;i < strs.length;i++) {
let str = strs[i]
const currMap = new Map()
for (let j = 0;j < str.length;j++) {
let char = str[j]
if (currMap.has(char)) {
currMap.set(char,currMap.get(char) + 1)
} else {
currMap.set(char,1)
}
}
//序列化map
let key = [...currMap].sort().join('')
if (map.has(key)) {
map.get(key).push(str)
} else {
map.set(key,[str])
}
}
return [...map.values()]
};
方法二:排序比较法
var groupAnagrams = function(strs) {
//解题思路:排队比较法
let map = new Map();
for (let i = 0;i < strs.length;i++) {
let str = strs[i];
let key = str.split('').sort().join('');
if (map.has(key)) {
map.get(key).push(str)
} else {
map.set(key, [str])
}
}
return [...map.values()];
};