题目描述
AC代码
/*
思路:
不管是eat、ate还是tae等等,我们可以发现它们实际上是相同字母之间的不同排列。
对于这样规律的字符串,我们将他们按照字母从小到大的顺序进行排列,都可以得到一个相同的字符串。
比如说:
ate aet
tae aet
eat aet
如果字符串排序后的结果相同那么我们认为它们是同类的,用hashmap来保存这样的关系。
理清关系之后,通过遍历map加入list集合即可得到答案。
*/
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> map=new HashMap<>();
for(String str:strs){
char[] keyChar=str.toCharArray();
Arrays.sort(keyChar);
String key=String.valueOf(keyChar);
List<String> stringList=new ArrayList<String>();
if(map.containsKey(key)){
stringList=map.get(key);
stringList.add(str);
map.put(key,stringList);
}else{
stringList.add(str);
map.put(key,stringList);
}
}
List<List<String>> res=new ArrayList<>();
for(String key:map.keySet()){
res.add(map.get(key));
}
return res;
}
}
上述代码还可以在精简一些,如下:
/*
思路:
不管是eat、ate还是tae等等,我们可以发现它们实际上是相同字母之间的不同排列。
对于这样规律的字符串,我们将他们按照字母从小到大的顺序进行排列,都可以得到一个相同的字符串。
比如说:
ate aet
tae aet
eat aet
如果字符串排序后的结果相同那么我们认为它们是同类的,用hashmap来保存这样的关系。
理清关系之后,通过遍历map加入list集合即可得到答案。
*/
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> map=new HashMap<>();
for(String str:strs){
char[] keyChar=str.toCharArray();
Arrays.sort(keyChar);
String key=String.valueOf(keyChar);
if(!map.containsKey(key))
map.put(key,new ArrayList<>());
map.get(key).add(str);
}
return new ArrayList(map.values());
}
}