这个题很有意思,难度不大,但是思路有趣,代码的语法糖很多,注意一下。
首先,创建一个hashmap,map中存放String:list-String,其含义为:经过排序的String:未经过排序的Stringlist。
对于每个String,先将其排序,得到的新String进行contains,若存在在map中,则取出map中的list,将原始String添加进list中,若不存在在map中,则直接创建新的list并将其添加进map中,注意这里用排序后的String当成key,最终直接取出所有键值,并将其输出即可。
看代码:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<>();
for(String str : strs){
char[] arr = str.toCharArray();
Arrays.sort(arr);//排序
//这个是排序的方法 可以直接修改数组
String r = new String(arr);//可以这样将字符数组转化为字符串
List<String> list = map.getOrDefault(r,new ArrayList<>());
//根据r提取出map中的list,如果没有就创建新list
list.add(str);//将str添加进list中
map.put(r,list);//放回list
}
return new ArrayList<List<String>>(map.values());
//map.values可以取出所有键值对
//由于这个东西本身就是个list,所以取出来之后有两重list
}
}