76. 最小覆盖子串

Posted yangbocsu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了76. 最小覆盖子串相关的知识,希望对你有一定的参考价值。

76. 最小覆盖子串

一、题目

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

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。

二、参考代码

Java 用Map记录字母出现个数的写法,
最后一个测试用例通不过时,要明白一件事。
Integer是对象啊。。。
Integer会缓存频繁使用的数值,
数值范围为-128到127,在此范围内直接返回缓存值。
超过该范围就会new 一个对象。
class Solution 
    public String minWindow(String s, String t) 
        // 需要凑齐的字符:
        HashMap<Character, Integer> need = new HashMap<>();
        // 记录窗口中的字符
        HashMap<Character, Integer> window = new HashMap<>();
        for (char i : t.toCharArray())
            need.put(i,need.getOrDefault(i,0)+1);
        
        int left=0, right=0;
        int len = Integer.MAX_VALUE;
        int start = 0;
        // valid变量表示窗口中满足need条件的字符个数
        int valid = 0;
        while (right < s.length())
            // ch 是将移入窗口的字符
            char ch = s.charAt(right);
            // 扩大窗口
            right ++;
            // 进行窗口内数据的一系列更新
            if (need.containsKey(ch))
                window.put(ch,window.getOrDefault(ch,0)+1);
                if (window.get(ch).intValue() == need.get(ch).intValue())
                    valid++;
                
            

            // 判断左侧窗口是否要收缩
            while (valid == need.size())
                // 在这里更新最小覆盖子串
                if (right - left < len)
                    start = left;
                    len = right - left;
                
                // d 是将移出窗口的字符
                char d = s.charAt(left);
                // 缩小窗口
                left ++;
                // 进行窗口内数据的一系列更新
                if (need.containsKey(d))
                    if (window.get(d).intValue() == need.get(d).intValue())
                        valid--;
                    
                    window.put(d,window.get(d).intValue()-1);
                
            
        
        return len == Integer.MAX_VALUE ? "" : s.substring(start,start+len);
    

以上是关于76. 最小覆盖子串的主要内容,如果未能解决你的问题,请参考以下文章

76. 最小覆盖子串 完整题解 刷题笔记

5-106-(LeetCode- 76) 最小覆盖子串

leetcode-76 最小覆盖子串

[leetcode] 76. 最小覆盖子串

76. 最小覆盖子串

76. 最小覆盖子串