76. 最小覆盖子串 (JAVA)

Posted joannae

tags:

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

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:

如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

 

class Solution {
    public String minWindow(String s, String t) {
        Map<Character, Integer> srcMap = new HashMap<>();
        Map<Character, Integer> targetMap = new HashMap<>();
        for(int i = 0; i < t.length(); i++){
            targetMap.put(t.charAt(i), targetMap.getOrDefault(t.charAt(i),0)+1);
        }

        int startPointer = 0;
        int endPointer = -1;
        int minStart = 0;
        int minEnd = s.length();
        while(true){
            if(isContainMap(srcMap,targetMap)) { //找到一种解决方案
                if(endPointer - startPointer < minEnd - minStart){
                    minStart = startPointer;
                    minEnd = endPointer;
                }

                //缩小window
                srcMap.put(s.charAt(startPointer),srcMap.get(s.charAt(startPointer))-1);
                startPointer++; 
            } else {
                //扩大window
                endPointer++;
                if(endPointer >= s.length()) break; 
                srcMap.put(s.charAt(endPointer), srcMap.getOrDefault(s.charAt(endPointer), 0)+1);
                
            }
        }
        return minEnd < s.length() ? s.substring(minStart, minEnd+1) : "";
    }

    private boolean isContainMap(Map<Character, Integer> srcMap, Map<Character, Integer> targetMap) {
        for (Character key : targetMap.keySet()) {
            if(!srcMap.containsKey(key) || srcMap.get(key) < targetMap.get(key)) return false;
        }
        return true;
    }
}

 

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

76. 最小覆盖子串 (JAVA)

精选力扣500题 第60题 LeetCode 76. 最小覆盖子串c++/java详细题解

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

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

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

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