ps:本文章仅用来记录日常学习的所思所想,各位看到可取之处也可纳为己用,说的不对的地方还请多多指教。
1.题目描述
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]
仅包含小写字母
2.题目分析
首先理解题目,字母异位词分组乍一看不懂是什么意思,但我们看示例就知道是指含有相同个数的相同字母的字符串,例如["ate","eat","tea"] 。理解了要干什么就可以开始构思代码该怎么写了。其实作为一个小白我看到这题是懵的,一下都是我看了答案之后的理解,仅供参考。
HashMap:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<String, List<String>>();
for(String str : strs){
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
List<String> list = map.getOrDefault(key,new ArrayList<String>());
list.add(str);
map.put(key,list);
}
return new ArrayList<List<String>>(map.values());
}
}
来源:力扣(LeetCode)
首先我们创建一个哈希映射(HashMap)用于存储分组后的异位词。键是异位词的排序后的形式,值是一个列表,包含了具有相同键的异位词。
然后我们遍历给定的数组,并用str.toCharArray()将其转化为数组以便我们排序。
既然是含有相同个数的相同字母的字符串,即使顺序不同,但我们用Arrays.sort()排序之后它们肯定也会是相等的。
String key = new String(array) 这串代码将排序后的字符数组转换回字符串,作为键 key,这是一种很简略的写法,但可读性强。
getOrDefault(Object key, V defaultValue)这个方法从哈希映射中获取键为 key
的值,如果该键不存在,则返回一个新的空列表。(其实这里我也不是很懂是为什么这么做,有懂的大佬可以指点一下)。
3.总结
哈希表真的很强大,但不懂原理的我看了答案也是懵懵懂懂的,过段时间我会认真学习哈希表再做修稿跟单独出个分享。