一、题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
解释:
在 strs 中没有字符串可以通过重新排列来形成 “bat”。
字符串 “nat” 和 “tan” 是字母异位词,因为它们可以重新排列以形成彼此。
字符串 “ate” ,“eat” 和 “tea” 是字母异位词,因为它们可以重新排列以形成彼此。
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母
二、题目解析
1、全部异位词共性:排序后唯一,可以此作为map的key,此key下的全部异位词组成list
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs == null || strs.length == 0){
return null;
}
HashMap<String,List<String>> map = new HashMap<>();
for(int i = 0;i < strs.length;i++){
String curKey = sortString(strs[i]);
if(!map.containsKey(curKey)){
List<String> curList = new ArrayList<>();
curList.add(strs[i]);
map.put(curKey,curList);
}else{
List<String> curList = map.get(curKey);
curList.add(strs[i]);
map.put(curKey,curList);
}
}
List<List<String>> res = new ArrayList<>();
for(Map.Entry<String,List<String>> entry : map.entrySet()){
List<String> cur = entry.getValue();
res.add(cur);
}
return res;
}
public String sortString(String s){
char[] chs = s.toCharArray();
Arrays.sort(chs);
return new String(chs);
}
}
运行:
2、在1的基础上优化
- map.getOrDefault可代替if-else结构,简化代码
- map.values()可把map的全部值快速提取转换成list
- new ArrayList<>(sourceMap.values())
- new HashSet<>(sourceMap.values());
- String.valueOf()可支持将基本数据类型,char数组,object对象转换成字符串
简化代码如下:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs == null || strs.length == 0){
return null;
}
HashMap<String,List<String>> map = new HashMap<>();
for(int i = 0;i < strs.length;i++){
String curKey = sortString(strs[i]);
List<String> curList = map.getOrDefault(curKey,new ArrayList<String>());
curList.add(strs[i]);
map.put(curKey,curList);
}
return new ArrayList<List<String>>(map.values());
}
public String sortString(String s){
char[] chs = s.toCharArray();
Arrays.sort(chs);
return String.valueOf(chs);
}
}