76. 最小覆盖子串

76. 最小覆盖子串:

题目链接 :76. 最小覆盖子串

题目:
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。


思路:滑动窗口

  1. 先将子串t中出现元素存入hashMap,再遍历串s比较与t中重合的元素。
  2. 通过重合元素的个数来确立右侧边界,并且记录不重复的元素个数Vaild
  3. 当记录的元素个数达到了t串所需后,需要考虑左侧边界的收缩
  4. 左边界收缩时需要判断离开窗口的元素的出现次数是否是满足t串需求,如果满足t串需求,那么该元素在该次出窗口后达不到要求,则vaild-1,此时不满足vaild==t.length(),所以右侧窗口继续扩展。

AC代码:

class Solution {
    public String minWindow(String s, String t) {
        Map<Character,Integer> need=new HashMap<>();
        Map<Character,Integer> win=new HashMap<>();
        for(char c:t.toCharArray())
        {
            need.put(c,need.getOrDefault(c,0)+1);
        }
        int st=0,l=0,r=0,len=Integer.MAX_VALUE;
        int valid=0;
        while(r<s.length())
        {
            char c=s.charAt(r);
            r++;
            if(need.containsKey(c))
            {
                win.put(c,win.getOrDefault(c,0)+1);
                if(win.get(c).equals(need.get(c)))
                {
                    valid++;
                }
            }
            while(valid==need.size())
            {
                if(len>r-l)
                {
                    st=l;
                    len=r-l;
                }
                char c1=s.charAt(l);
                l++;
                if(need.containsKey(c1))
                {
                    if(win.get(c1).equals(need.get(c1)))
                    {
                        valid--;
                    } 
                    //
                    win.put(c1,win.getOrDefault(c1,0)-1);
                        
                    
                }
            }
        }
        return len==Integer.MAX_VALUE?"":s.substring(st,st+len);
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值