76. Minimum Window Substring (sliding window)

use two pointers (sliding window)

T :O(m+n)

S: O(|target|+|source|)

class Solution {
    public String minWindow(String s, String t) {
        int n = s.length();
        Map<Character, Integer> sCounter = new HashMap<>(); // char, count
        Map<Character, Integer> tCounter = new HashMap<>(); // char, count
        
        // record target char, freq
        for (char c : t.toCharArray()) {
            tCounter.put(c, tCounter.getOrDefault(c, 0)+1);
        }

        int end = 0;
        int charMatchedNum = 0;
        int resStart = 0;
        int resLen = Integer.MAX_VALUE; // for mini len result
        for (int start = 0; start < n; start++) {
            while (end < n && charMatchedNum < tCounter.size()) {
                char c = s.charAt(end);
                sCounter.put(c, sCounter.getOrDefault(c, 0)+1); // record source char, freq
                
                // needs integer to int, unboxing not work
                if ((int)sCounter.get(c) == (int)tCounter.getOrDefault(c,0)) { // if char freq equals, find matched
                    charMatchedNum++;
                }
                end++;
            }

            if (charMatchedNum == tCounter.size()) { // if matched count == target freq count, can get a result
                if (resLen > end - start) { // but we want mini len of result
                    resStart = start; // result's start index
                    resLen = end - start; // result's len
                }
            }
            
            char c = s.charAt(start);
            sCounter.put(c, sCounter.getOrDefault(c,0)-1); // out of the start index loop, 
            
            // 如果兩者減1後, 相等, matched count應該 --
            if ((int)sCounter.get(c) == (int)(tCounter.getOrDefault(c,0) - 1)) { 
                charMatchedNum--;
            }
        }
        // 如果 resLen 還是最大值, 代表找不到
        return resLen == Integer.MAX_VALUE ? "" : s.substring(resStart, resStart + resLen);
    }
}

Last updated

Was this helpful?