欢迎光临
我们一直在努力

LeetCode Hot 100 49.字母异位词分组

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());

}
}

运行示例:

在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » LeetCode Hot 100 49.字母异位词分组
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址