leetcode 76 最小覆蓋子串
阿新 • • 發佈:2021-06-12
簡介
如果給我做的話, 直接暴力, 應該會超時吧.
直接看了答案, 感覺也不是特別巧妙.
雙指標
class Solution { Map<Character, Integer> ori = new HashMap<Character, Integer>(); // 要覆蓋的 Map<Character, Integer> cnt = new HashMap<Character, Integer>(); // 當前範圍的 public String minWindow(String s, String t) { int tLen = t.length(); for(int i=0; i<tLen; i++){ char c = t.charAt(i); ori.put(c, ori.getOrDefault(c, 0) + 1); // 將map增加一個 } int l = 0, r = -1; int len = Integer.MAX_VALUE, ansL = -1, ansR = -1; int sLen = s.length(); while(r < sLen) { ++r; if(r < sLen && ori.containsKey(s.charAt(r))) { cnt.put(s.charAt(r), cnt.getOrDefault(s.charAt(r), 0) + 1); // 先r右邊移動 } while(check() && l <= r) { // 如果滿足條件左邊移動 if(r - l + 1 < len) { len = r - l + 1; ansL = l; ansR = l + len; } if (ori.containsKey(s.charAt(l))) { cnt.put(s.charAt(l), cnt.getOrDefault(s.charAt(l), 0) -1); } ++l; } } return ansL == -1 ? "" : s.substring(ansL, ansR); } public boolean check() { Iterator iter = ori.entrySet().iterator(); while(iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Character key = (Character) entry.getKey(); Integer val = (Integer) entry.getValue(); if(cnt.getOrDefault(key, 0) < val) { return false; } } return true; } }