这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战
前言
力扣第四十九题 字母异位词分组
如下所示:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
一、思路
力扣第四十九题-字母异位词分组中有一个比较重要的信息:
- **
字母异位词
就是相同字符排列成的不同字符串**,如abc
和bac
就是字母异位词
对于 abc
和 bac
来说,如何通过一次遍历就能正确的找到这两个 字母异位词
呢?
- 将字符串中的字符排序,使得
字母异位词
的key
相同 哈希表
中存储排序后的key
,从而使字母异位词
可以正确的分组
综上所述,我们的整体思路为:排序 + 哈希表
举个例子
此处以 strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
作为例子
i=0
时,strs[0] = "eat"
排序后的key = "aet"
。此时map
中不含此key
,故将"eat"
放入新建的List
中i=1
时,strs[1] = "tea"
排序后的key = "aet"
。此时map
中含有此key
,将"tea"
放入该key
对应的List
中i=2
时,strs[2] = "tan"
排序后的key = "ant"
。此时map
中不含此key
,故将"tan"
放入新建的List
中i=3
时,strs[3] = "ate"
排序后的key = "aet"
。此时map
中含有此key
,将"ate"
放入该key
对应的List
中i=4
时,strs[4] = "nat"
排序后的key = "ant"
。此时map
中含有此key
,将"nat"
放入该key
对应的List
中i=5
时,strs[5] = "bat"
排序后的key = "abt"
。此时map
中不含此key
,故将"bat"
放入新建的List
中- 最终可以获得正确的
字母异位词
分组
二、实现
实现代码
实现代码与思路中保持一致
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for (String str : strs) {
char[] array = str.toCharArray();
Arrays.sort(array); // 排序
String key = new String(array);
List<String> list;
if (map.containsKey(key)) { // 判断key是否存在
list = map.get(key);
} else {
list = new ArrayList<>();
}
list.add(str);
map.put(key, list);
}
return new ArrayList<>(map.values());
}
测试代码
public static void main(String[] args) {
String[] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
new Number49().groupAnagrams(strs);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥