题目描述:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
所有输入均为小写字母。
不考虑答案输出的顺序。
解析:
①将字符串数组中的每一个字符串转成字符数组排序,如果是异位词,则排序后的字符数组相同;
②利用map集合将排序后的异位词作为key值,ArrayList< String >作为value,即异位词只对应一个key值,异位词存在key对应的value中(ArrayList);
③遍历字符串数组,如果map中出现异位词,则将其加入到对应map中的value值中;
④取出map集合中所有value值加入到List中返回。
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String,List<String>> hashmap = new HashMap<String,List<String>>();
List<List<String>> lists = new ArrayList<>();
for (int i = 0; i < strs.length; i ++){
//将每一个单词字符转换成字符数组
char[] arrchar = strs[i].toCharArray();
//对每个字符数组进行排序,异位词字符排序后相同
Arrays.sort(arrchar);
//将排序后的异位词字符数组转换成字符串
String s = String.valueOf(arrchar);
//如果hashmap中不含有s,则不是异位词,增加新的List
//即每一种异位词对应一个List
if (!hashmap.containsKey(s))
hashmap.put(s, new ArrayList<String>());
//将异位词添加到同一个List中
hashmap.get(s).add(strs[i]);
}
//遍历hashmap中的中value值,即不同异位词的List,将其添加到同一个List中返回
for (List<String> list : hashmap.values()) {
lists.add(list);
}
return lists;
}