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

 

posted on 2020-07-05 20:35  joannae  阅读(740)  评论(0编辑  收藏  举报

导航