[LeetCode]76. 最小覆盖子串(java实现)双指针+哈希表

1. 题目

在这里插入图片描述
在这里插入图片描述

2. 读题(需要重点注意的东西)

思路(双指针):
哈希表T统计字符串t中每个字符出现的次数
哈希表W统计滑动窗口内(j 到 i 之间)每个字符出现的次数;
cnt来记录字符串t中有多少个字符在窗口中,如果cnt = t.length(),则说明窗口中包含了 字符串t 所有的字符了。

其做法与[LeetCode] 3. 无重复字符的最长子串(java实现)类似。

具体做法:

  • i 向后移动,将s.charAt(i)记录到哈希表W中;

  • 判断:如果此时哈希表W中s.charAt(i)的字符个数小于字符串t中s.charAt(i)的字符个数:
    hash_w.get(s.charAt(i)) < hash_t.get(s.charAt(i)),则说明s.charAt(i)合法,cnt++;

  • 然后判断:hash_w.get(s.charAt(j)) 是否大于 hash_t.get(s.charAt(j)),如果大于,则说明这个字符多余了,j++;

  • 如果cnt == t.length(),用窗口长度更新最小的最短距离res即可

代码按上述解法实现即可。

3. 解法

---------------------------------------------------解法---------------------------------------------------

class Solution {
    public String minWindow(String s, String t) {
        Map<Character,Integer> hashmap_t = new HashMap<>();
        Map<Character,Integer> hashmap_w = new HashMap<>();
        for(var c : t.toCharArray()) hashmap_t.put(c,hashmap_t.getOrDefault(c,0)+1);
        String res = "";
        for(int i = 0,j = 0,cnt = 0;i < s.length();i++){
            var c = s.charAt(i);
            hashmap_w.put(c,hashmap_w.getOrDefault(c,0)+1);
            if(hashmap_t.containsKey(c) && hashmap_w.get(c) <= hashmap_t.get(c)) cnt++;
            while(j < i && (!hashmap_t.containsKey(s.charAt(j)) || hashmap_w.get(s.charAt(j)) > hashmap_t.get(s.charAt(j)))){
                hashmap_w.put(s.charAt(j),hashmap_w.get(s.charAt(j))-1);
                j++;
            }
            if(cnt == t.length()){
                if(res.length() > i - j + 1 || res == ""){
                    res = s.substring(j,i + 1);
                }
            }
        }
        return res;
    }
}

可能存在的问题:

4. 可能有帮助的前置习题

5. 所用到的数据结构与算法思想

6. 总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cloudeeeee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值