leetcode49.字母异位次分组——学习笔记

题目:https://leetcode-cn.com/problems/group-anagrams/icon-default.png?t=M0H8https://leetcode-cn.com/problems/group-anagrams/

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map = new HashMap<String,List<String>>();
        for(String str:strs){
            char[] array = str.toCharArray();
            Arrays.sort(array);
            String key = new String(array);
            List<String> list = map.getOrDefault(key,new ArrayList<String>());
            list.add(str);
            map.put(key,list);
        }
        return new ArrayList<List<String>>(map.values());
    }
}

 

 思路:由于不熟悉HashMap的使用,这一次是看完题解之后才自己仿写出来的。大概思路是,将strs[]数组中的元素排序后作为键值,若字母异位的单词在排序后是一样的,即是键值一样。因此,可以通过比键值来判断map中是否出现过当前元素。若出现过,则调出对应键值后的list,将当前元素加入到list中,最后再将该键值对应的新list添加入map中覆盖掉map中原有的list;若没出现过,则新建一个list,将当前元素放入list中,把新键值和新list一同添加到map中去。

1.声明一个HashMap,键值key是String类型的,key后对应的数据的类型是List<String>的。

Map<String,List<String>> map = new HashMap<String,List<String>>();

2.逐个遍历题目给定的strs[]数组,并把其存入一个str变量中。

for(String str:strs){
    //......
}

3.将str字符串转换成char类型的数组(方便后续排序),然后对该字符串数组排序。完成排序后的字符数组转换回String类型,这个便是键值key。 

char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);

4.声明一个list,调用getOrDefault方法。getOrDefault方法是,判断map中是否存在key值,若存在则将key值对应的List<String>类型的数据传出;若key值不存在,则执行new ArrayList<String>()。因此,如果map中没有当前的key,则list会是空的,如果map中有当前的key,则list是储存了map中对应key值后的list。然后再将str加到list中,接着把key值和对应的list加到map中去。(因为HashMap不允许相同的键值重复出现,如果传入的key重复,则会让新的list覆盖map中原有的llist,这恰恰是我们需要的效果。)

List<String> list = map.getOrDefault(key,new ArrayList<String>());
list.add(str);
map.put(key,list);

5.完成上述循环后,新建一个list装map.values(),然后返回。

return new ArrayList<List<String>>(map.values());

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hokachi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值