leetcode76. 最小覆盖子串
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
滑动窗口
看了题解才明白的。
首先用map记录t字符串每个字符出现的次数,然后窗口也有一个对应的map。每次窗口变化的时候,判断窗口的map里面的每个值是不是小于对应的tmap里面的每个值。如果是的话,说明这个还能更小,更新长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| class Solution { HashMap<Character,Integer> tMap = new HashMap<>(); HashMap<Character,Integer> sMap = new HashMap<>(); public String minWindow(String s, String t) { for (int i = 0; i < t.length(); i++) { tMap.put(t.charAt(i),tMap.getOrDefault(t.charAt(i),0) + 1); } int l = 0,r = 0, minLen = Integer.MAX_VALUE; int ansR = -1,ansL = -1; while (r < s.length()) { if (r < s.length() && tMap.containsKey(s.charAt(r))) { sMap.put(s.charAt(r),sMap.getOrDefault(s.charAt(r),0) + 1); } while (check() && l <= r) { if (r - l + 1 < minLen) { minLen = r - l + 1; ansL = l; ansR = l + minLen; } if (tMap.containsKey(s.charAt(l))) { sMap.put(s.charAt(l),sMap.getOrDefault(s.charAt(l),0) - 1); } l++; } r++; } return ansL == -1 ? "" : s.substring(ansL,ansR); } public boolean check() { Set<Map.Entry<Character,Integer>> tSet = tMap.entrySet(); Iterator<Map.Entry<Character,Integer>> iterator = tSet.iterator(); while (iterator.hasNext()) { Map.Entry<Character,Integer> entry = iterator.next(); char k = entry.getKey(); int v = entry.getValue(); if (sMap.getOrDefault(k,0) < v) { return false; } } return true; } }
|
leetcode 103