这是我参与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);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥