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);
    }
}

你可能感兴趣的:(LeetCode刷题,滑动窗口,leetcode,算法,动态规划)