力扣49(java)-字母异位词分组(中等)

题目:

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

 示例 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] 仅包含小写字母

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

哈希表:

1.首先判断特殊情况,字符串数组为空就返回一个空的ArrayList集合;

2.字符串数组不为空,首先创建一个哈希表,然后将不同的字符串利用toCharArray()转换成char[]字符数组;

3.然后对char[]按照字母顺序进行排序;

4.再将排序后的字符串作为哈希表map中的key值,判断哈希表中是否有当前key值,若不存在,则为新的异位词语,在map中新建一个字符串集合作为value,然后将该当前键值对放在map中,如果存在,获取当前key对应的value(list集合),再将遍历的字符串s,添加到list集合中;

4.遍历完所有的字符串后,返回map中所有键值对象构成的list。

代码:

 1 class Solution {
 2     public List<List<String>> groupAnagrams(String[] strs) {
 3        if (strs == null || strs.length == 0){
 4            return new ArrayList();
 5        }
 6        //创建一个哈希表
 7        HashMap<String, List> map = new HashMap<>();
 8        //遍历字符数组
 9        for (String str : strs){
10            //将每个字符串转换成字符数组
11            char[] chars = str.toCharArray();
12            Arrays.sort(chars);
13            //将排序后的字符串数组转化为字符串,作为哈希表的key
14            String key = String.valueOf(chars);
15            //如果哈希表中不存在排序后的字符串key,则加入
16            if (!map.containsKey(key)){
17                map.put(key,new ArrayList());
18            }
19             //如果哈希表中存在的当前的key,说明当前字符串为字母异位词
20             map.get(key).add(str);
21         }
22        return new ArrayList(map.values());
23     }
24 }

小知识:

String key = String.valueOf(chars):chars是字符数组类型,该句的意思就是将字符数组类型转换成字符串;

String.valueOf,这个方法在使用的时候是有些特殊的。一般情况下,如果是确定类型的null传入,返回的是字符串“null”,而如果直接传入null,则会发生错误。

例如:

1 String teString=null;
2 teString=String.valueOf(teString);
3 System.out.println(teString);

因为确定了传入的是String类型,在valueOf调用对应构造函数时不会发生错误,因此,返回的是字符串“null”。

如果这样写 String.valueOf(null),则提示空指针。

 

posted on 2022-05-14 21:23  我不想一直当菜鸟  阅读(68)  评论(0编辑  收藏  举报