Q13 LeetCode76 最小覆蓋子串

清川1發表於2024-06-07

1.難題

2.need.containsKey(r) 看hashmap中是否含有r

3.明天再覆盤一遍

 1 class Solution {
 2     public String minWindow(String s, String t) {
 3         if (s == null || s.isEmpty() || t == null || t.isEmpty() || s.length() < t.length()) return "";
 4 
 5         Map<Character, Integer> need = new HashMap<>();
 6         Map<Character, Integer> window = new HashMap<>();
 7 
 8         // 初始化 need,記錄 t 中每個字元的出現次數
 9         for (char c : t.toCharArray()) need.put(c, need.getOrDefault(c, 0) + 1);
10 
11         int left = 0, right = 0; // 視窗的左右邊界
12         int valid = 0; // 已經匹配上的字元數量
13         int start = 0, minLen = Integer.MAX_VALUE; // 最小視窗的起始位置和長度
14 
15         while (right < s.length()) {
16             char r = s.charAt(right);
17             right++;
18 
19             // 更新視窗內字元的計數
20             if (need.containsKey(r)) {
21                 window.put(r, window.getOrDefault(r, 0) + 1);
22                 if (window.get(r).equals(need.get(r))) valid++;
23             }
24 
25             // 當視窗內的字元已經完全包含了 t 中的所有字元時
26             while (valid == need.size()) {
27                 // 更新最小視窗的起始位置和長度
28                 if (right - left < minLen) {
29                     start = left;
30                     minLen = right - left;
31                 }
32 
33                 char l = s.charAt(left);
34                 // 縮小視窗,移動左邊界
35                 if (need.containsKey(l)) {
36                     window.put(l, window.get(l) - 1);
37                     if (window.get(l) < need.get(l)) valid--;
38                 }
39                 left++;
40             }
41         }
42         return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);
43     }
44 }

相關文章