1. 程式人生 > 其它 >八、迴圈語句

八、迴圈語句

給你一個字串 s 、一個字串 t 。返回 s 中涵蓋 t 所有字元的最小子串。如果 s 中不存在涵蓋 t 所有字元的子串,則返回空字串 "" 。

注意:

對於 t 中重複字元,我們尋找的子字串中該字元數量必須不少於 t 中該字元數量。
如果 s 中存在這樣的子串,我們保證它是唯一的答案。
 

來源:力扣(LeetCode)
連結:https://leetcode.cn/problems/minimum-window-substring
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

class Solution {
    public String minWindow(String s, String t) {
        
if (s.length() < t.length() || s.length() == 0 || s == null) { return ""; } Map<Character, Integer> t_map = new HashMap<>(); for (int i = 0; i < t.length(); i++) { t_map.put(t.charAt(i), t_map.getOrDefault(t.charAt(i), 0) + 1); } Map
<Character, Integer> s_map = new HashMap<>(); // 滿足條件的字串 int valid = 0; // 左右指標 int left = 0, right = 0; // 記錄最小的視窗 int min_len = Integer.MAX_VALUE, min_left = 0; while (right < s.length()) { char ch = s.charAt(right);
// 擴大右邊界 right++; s_map.put(ch, s_map.getOrDefault(ch, 0) + 1); if (s_map.get(ch).equals(t_map.get(ch))) { valid++; } // 當滿足條件的時候,需要縮小視窗,增大左指標 while (valid == t_map.size()) { if (right - left < min_len) { min_len = right - left; min_left = left; } char c = s.charAt(left); if (s_map.get(c).equals(t_map.get(c))) { valid--; } s_map.put(c, s_map.get(c) - 1); left++; } } return min_len == Integer.MAX_VALUE ? "" : s.substring(min_left, min_len + min_left); } }