[スライディング ウィンドウ] LCR 017. 最小カバー部分文字列

LCR 017. 最小カバー部分文字列

問題解決のアイデア

  • need は、条件を満たす実際の有効な文字を記録します。
  • ウィンドウは現在のウィンドウ内のすべての文字を記録します
  • を走査し、各文字をウィンドウに送信して、有効な条件を満たす有効な文字の数を計算します。
  • 有効なサイズと必要なサイズを決定し、ウィンドウを縮小する必要があるかどうかを決定します。
  • 縮小が必要な場合は、ウィンドウの長さを計算し、start と minLen を更新します。
  • 最後に、左側のキャラクターをウィンドウから削除すると、

class Solution {
    
    
    public String minWindow(String s, String t) {
    
    
        Map<Character, Integer> need = new HashMap<>();
        Map<Character, Integer> window = new HashMap<>();

        // 初始化need
        for (int i = 0; i < t.length(); i++) {
    
    
            need.put(t.charAt(i), need.getOrDefault(t.charAt(i), 0) + 1);
        }

        int left = 0;
        int right = 0;
        int valid = 0; // 记录窗口满足条件的有效字符个数
        int start = 0; // 最小窗口的起始位置
        int minLength = Integer.MAX_VALUE; // 最小窗口的长度

        while (right < s.length()) {
    
    
            char c = s.charAt(right);
            right++;

            if (need.containsKey(c)) {
    
    
                window.put(c, window.getOrDefault(c, 0) + 1);

                if (window.get(c).equals(need.get(c))) {
    
    
                    valid++;
                }
            }

            // 判断是否需要收缩
            while (valid == need.size()) {
    
    
                // 更新最小窗口信息
                if (right - left < minLength) {
    
    
                    start = left;
                    minLength = right - left;
                }

                char d = s.charAt(left);
                left++;

                if (need.containsKey(d)) {
    
    
                    if (window.get(d).equals(need.get(d))) {
    
    
                        valid--;
                    }

                    window.put(d, window.get(d) - 1);
                }
            }
        }

        if (minLength == Integer.MAX_VALUE) {
    
    
            return "";
        } else {
    
    
            return s.substring(start, start + minLength);
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_44653420/article/details/133217891