leetcode76--最小覆盖子串

leetcode76–最小覆盖子串

题目描述

题目链接:leetcode76
在这里插入图片描述

解题思路–滑动窗口

对于本题,首先可以根据题目描述是属于滑动窗口解法,和leetcode的第三题比较像,对于滑动窗口解法,首先我们需要定义左节点,右节点,窗口长度,剩下的就是中间的判别过程了。对于本题,给定了总字符串长度s,以及目标字符串长度t。寻找s中覆盖t的最小子串。如果不存在则返回空字符串,所有这是一道有返回值的题目,返回值类型为String,所以我们定义一个res作为返回值,默认值就为“”。首先我们先遍历一下目标字符串t,将目标字符串中的所有的数值以及出现的次数存储进入map集合中。在遍历了目标字符串t之后,我们先进行右节点进行遍历,在左节点小于总长度的前提下,右节点不断的向右移动。接着判断s.charAt(right)是否是字符串t中的字符,每发现t中的一个字符,相应的HashMap中的值就需要减1。如果在HashMap中s.charAt(right)所对应的字符的数量大于0,则说明t中的该字符还有剩余数量,并没有完全被s中[left, right]范围的字符串所包含,此时需要count++,同时HashMap中对应的键的值需要-1。如果在HashMap中s.charAt(right)所对应的字符的数量已经小于等于0了,那么说明s中[left, right]范围的字符串包含了超出t中所包含个数的相应字符,此时count不应该+1,但是HashMap中对应的键的值仍然需要-1,表示s中[left, right]范围的字符串包含了富余的相应字符。如果count >= t.length()则说明s中[left, right]范围的字符串已经包含了t中所有字母。left指针需要向右移动。在左指针向左移动的过程中,我们需要先判断一下当前字符串在左指针所指向的位置对应的数是否存在于hashmap中,如果存在那么也需要判断一下当前左指针所对应的值是否为0,如果等于0,则说明s中[left, right]范围的字符串所包含该字符的数量与t中所包含的数量相等,left右移缺失这个字符后,s中[left, right]范围的字符串所包含的t中的字符的数量会减少1,需要count–,同时相应的HashMap中的值需要+1。如果HashMap中所对应的字符的数量小于0,表示s中[left, right]范围的字符串包含了富余的相应字符,此时left右移缺失的这个字符不会导致count–,只需要HashMap中相应的值+1即可。

代码

class Solution {
    public String minWindow(String s, String t) {
         HashMap<Character,Integer> hashMap = new HashMap<>();
        for (int i = 0; i < t.length(); i++) {
            if(hashMap.containsKey(t.charAt(i))){
                hashMap.put(t.charAt(i),hashMap.get(t.charAt(i))+1);
            }else {
                hashMap.put(t.charAt(i),1);
            }
        }
//        System.out.println(hashMap);

        int left = 0;
        int right = -1;
        int count = 0;
        String res = "";
        int len = s.length() + 1;
        while (left < s.length()){
            if (right+1 < s.length() && count<t.length()){
                right ++ ;
                if (hashMap.containsKey(s.charAt(right))){
                    if (hashMap.get(s.charAt(right))>0){
                        count ++;
                    }
                    hashMap.put(s.charAt(right),hashMap.get(s.charAt(right))-1);
                }
            }
            else {
                if (hashMap.containsKey(s.charAt(left))){
                    if(hashMap.get(s.charAt(left)) == 0){
                        count --;
                    }
                    hashMap.put(s.charAt(left),hashMap.get(s.charAt(left))+1);
                }
                left ++;
            }

            if(count == t.length()){
                if(right - left + 1 < len){
                    len = right - left + 1;
                    res = s.substring(left,right+1);
                }
            }
        }
//        System.out.println(res);
        return res;
    }
}

在这里插入图片描述

参考

https://blog.csdn.net/qq_41231926/article/details/81427851

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Peihj2021

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

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

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

打赏作者

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

抵扣说明:

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

余额充值