LeetCode Hot 100 49.字母异位词分组
原题地址:49. 字母异位词分组 – 力扣(LeetCode)
目录
-
- LeetCode Hot 100 49.字母异位词分组
-
-
-
- 题目概述:
- 实现思路:
- 拓展知识:如何判断在算法题目中,是否需要使用 哈希表(HashMap/HashSet)结构
- 具体的实现代码如下:
- 运行示例:
-
-
题目概述:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
解释:
- 在 strs 中没有字符串可以通过重新排列来形成 "bat"。
- 字符串 "nat" 和 "tan" 是字母异位词,因为它们可以重新排列以形成彼此。
- 字符串 "ate" ,"eat" 和 "tea" 是字母异位词,因为它们可以重新排列以形成彼此。
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
- 1 <= strs.length <= 104
- 0 <= strs[i].length <= 100
- strs[i] 仅包含小写字母
实现思路:
什么是字母异位词:
首先要明白,字母异位词就是,一个字符串中,字母出现的频率相同,且不考虑它的位置顺序的就是字母异位词。
比如:
abac 和 baac 就是字母异位词
abcd 和 bdca 就是字母异位词
如何判断两个字符串元素是否为字母异位词:
字母异位词中的字母出现的频率是一致的,例如 [“ate”,“eat”,“tea”] 三个字符串经过排序后都是 “aet” 字符串,因此我们可以使用排序来判断是否是字母异位词。
字母异位词分组实现:
我们可以借助HashMap,对字母异位词进行分组,我们需要将排序后的字符串,作为map中的key, 对当前遍历到的字符串进行排序,然后在map中查找是否有对应的key,存在,则将该数组元素存入到这个key对应的value中,达到分组的目的。
同时,对于第一次遍历到的字符串元素,map中还没有相对应的key,我们需要先将它存入到list中作为value,然后再和key一起存入到map中。
我们可以借助java中的Arrays.sort() 这个API ,对字符串进行排序,减少代码工作量,并且要注意的是,Arrays.sort() 只能接收字符数组 参数。我们需要将,在字符串数组中遍历到的字符串元素转为字符数组,再作为参数传递到这个方法中。
为什么使用HashMap:
对于一些,需要使用到key这个索引来进行分组,或者判断,统计出现频率,并且根据key还要存储对应的value的数据结构,我们可以通过借助HashMap来实现我们的算法。
拓展知识:如何判断在算法题目中,是否需要使用 哈希表(HashMap/HashSet)结构
1.我们需要将一种数据映射到另一种数据,或者根据某种规则将数据归类时。
2.题目数据量比较大 (N > 10^4),题目涉及 统计出现频率 或者 快速查找某个元素是否存在时。
3.题目需要知道,“某个元素是否出现过”,不需要知道它出现的频率,或者不需要元素的索引时。
4.查找“两数之和” 或者 “差值为k的两个元素” ,“补数” 这类问题。
具体的实现代码如下:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//首先定义一个Map
Map<String, List<String>> map = new HashMap<>();
for(String s : strs){
//将数组中的字符串进行排序 — Arrays.sort()接收的是char[] 因此我们要将拿到的字符串s ,转换成char[]中的每一个元素
char[] chars = s.toCharArray(); //将字符串转为字符数组
Arrays.sort(chars);
String key = new String(chars); //将排序后的字符数组转换成字符串
//String key = String.valueOf(chars);的效果是一样的,valueOf底层是return new String(value)
//根据排序后的字符串作为key,并且判断map中是否包含这个key
if (map.containsKey(key)){
//存在对应的key,将排序前的字符串添加到这个key对应的value中
map.get(key).add(s);
}else{
//不存在对应的key
//先将字符串s添加到list中
List<String> list = new ArrayList<>();
list.add(s);
//再创建一个新的key,并创建一个value存入map
map.put(key, list);
}
}
//java 7+以后有了类型推断,我们可以省略构造函数左侧的泛型声明
//return new ArrayList<List<String>>(map.values());
return new ArrayList<>(map.values());
}
}
运行示例:


