代码随想录:哈希表相关题目推荐(49、438、350)

49.字母异位词分组

题目

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

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

代码(map)

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) { 
        //用map处理不同字母异位词的分组
        //key表示某个str的升序字符串
        //value表示对应key的所有str
        Map<String,List<String>> map = new HashMap<>();
        //遍历每一个字符串str,"cba"
        for(String str: strs){
            char[] chs = str.toCharArray();  //把str转为字符数组chs,{'c','b','a'}
            Arrays.sort(chs); //把字符数组chs升序排序,{'a','b','c'}
            String key = new String(chs);  //把chs转为String,作为key,"abc"
            //在map中找是否存在这个key"abc",如果存在返回对应的value列表
            //如果不存在,就new一个空的ArrayList
            List<String> value = map.getOrDefault(key,new ArrayList<>());
            value.add(str);  //把当前的"cba"字符串加入value
            map.put(key,value); //更新key和value
        }

        //获取map中value集合,map.values()返回值是Collection类型的
        //下面2种方式都能够把它转为List类型
        List<List<String>> res = new ArrayList<>(map.values()); //构造方法赋值
        //List<List<String>> res = map.values().stream().collect(Collectors.toList());
        return res;
    }
}

438.找到字符串中所有字母异位词

题目

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

代码(直接排序比较是否为异位词)

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        //判断异位词逻辑:把String转为chs,升序排序后转回String
        List<Integer> res = new ArrayList<>();
        char[] chs = p.toCharArray();  //把p转为字符数组,"cba"->{'c','b','a'};
        Arrays.sort(chs); //把p升序排序,{'a','b','c'};
        String sortP = new String(chs); //把p转为升序排序后的字符串"abc"
        //s长度为10,p长度为3,i最多只能走到7的位置
        for(int i=0; i <= s.length()-p.length();i++){
            String sub = s.substring(i,i+p.length());  //获取s中的子串sub,截取索引[i,i+p.length())
            char[] subChs = sub.toCharArray(); //把子串转为字符数组
            Arrays.sort(subChs); //子串升序
            String sortSub = new String(subChs); //子串转为String
            if(sortSub.equals(sortP)){  //说明该子串的升序结果和p的升序结果一样,是异位词
                res.add(i);
            }
        }
        return res;
    }
}

350.两个数组的交集II

题目

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

代码(map)

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        Map<Integer,Integer> map = new HashMap<>();
        List<Integer> list = new ArrayList<>();

        //遍历nums1,数-出现次数
        for(int i : nums1){
            map.put(i,map.getOrDefault(i,0)+1);
        }
        for(int i : nums2){
            //遍历nums2,在map中是否存在key
            if(map.containsKey(i)){
                list.add(i);  //存在,说明是交集,add到list中
                map.put(i,map.get(i)-1); //map对该key的value-1
                if(map.get(i) == 0){  //如果key的value为0,移除
                    map.remove(i);
                }
            }
        }
        //这三种方法可以把List转为Integer数组
        //Integer[] res = list.stream().toArray(Integer[]::new);
        //Integer[] res = list.stream().toArray(value -> new Integer[value]);
        //Integer[] res = list.toArray(Integer[]::new);
        
        //把list转为int数组返回
        int[] res = new int[list.size()];
        int index = 0;
        for(Integer i : list){
            res[index++] = i;
        }
        return res;
    }
}
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

守岁白驹hh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值