[Java恶补day2] 49. 字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母
知识点:
列表操作、字符串自身排序、哈希表操作
解:
观察题目要求的返回结果的类型是一个ArrayList:List<List<String>>
字母异位词,就是指某一个字符串所包含的字母,按照不同的顺序排列得到不同的字符串,这些字符串就构成同一个字母异位词。
为了存储具有相同字母异位词的字符串,考虑将每个字符串内部进行排序,这样,遵循#1 两数之和相同的原理,用hashmap存储,key为字母异位词,value为对应的字符串本身所构成的一个列表,这样就能成功存储,并且复杂度如下:
时间复杂度为 O ( n k l o g k ) O(nk logk) O(nklogk),n=字符串数量,k=字符串中最大的字母数。这里n是因为有一个for循环,k logk就是Arrays.sort()的复杂度。
空间复杂度为 O ( n k ) O(nk) O(nk),n=字符串数量,k=字符串中最大的字母数。因为map存储元素存储的是排序后的字符串,因此是n*k。
class Solution {public List<List<String>> groupAnagrams(String[] strs) {List<List<String>> res = new ArrayList<>();Map<String, List<String>> map = new HashMap<>();//遍历每个stringfor (String str : strs) {//将每个string按照字母进行排序// System.out.println("old: "+str);char[] chars = str.toCharArray();Arrays.sort(chars);String newStr = new String(chars);// System.out.println("new: "+newStr);if (map.containsKey(newStr)) {//将相同的排序后的字符串放入map的同个位置List<String> value = map.get(newStr);value.add(str);map.put(newStr, value);} else {//否则,把当前字符串加入一个新位置List<String> value = new ArrayList<>();value.add(str);map.put(newStr, value);}}//返回map中的每个value,顺序任意for (List<String> value : map.values()) {res.add(value);}return res;}
}