原题:
英:
Given an array of strings, group anagrams together.
For example, given: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
中:
给定一个字符串数组,将字母颠倒而成的分组。
例如,给出:[“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
返回:
[
["ate", "eat","tea"],
["nat","tan"],
["bat"]
]
解题思路:
这道题是将打乱顺序但是字母出现一样的单词整合到一起,所以会想到能不能用map来解决。key的设置是精髓所在,虽然单词中的字母顺序不一样,但是字母出现的次数是一样的。所以可以将字符串变为字符数组进行排序,作为键值。代码如下:
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList();
Map<String, List<String>> add = new HashMap<String, List<String>>();
for(String str: strs){
char[] car = str.toCharArray();//先把字符串转成字符数组的形式
Arrays.sort(car);//同一组的单词进行这样操作之后会得到相同的结果
String keyStr = String.valueOf(car);
if(add.get(keyStr)==null){
add.put(keyStr, new ArrayList<String>());//如果不存在这组,则新建一个list
}
add.get(keyStr).add(str);//对list进行添加
}
res.addAll(add.values());
return res;
}
}
重点说明:
1.这里将字符串转为字符数组,再进行排序。同一组的单词会出现相同的排序结果,意味着他们有相同的键值。
2.对map进行put操作,这里注意list添加的时候添加的是原始的字符串。