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