LeetCode 76. 最小覆盖子串

1、题目

image.png

2、分析

使用滑动窗口的算法框架。这道题还要注意下java处理字符串的常见的方法。

/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
    unordered_map need, window;
    for (char c : t) need[c]++;
    
    int left = 0, right = 0;
    int valid = 0; 
    while (right < s.size()) {
        // c 是将移入窗口的字符
        char c = s[right];
        // 右移窗口
        right++;
        // 进行窗口内数据的一系列更新
        ...

        /*** debug 输出的位置 ***/
        printf("window: [%d, %d)\n", left, right);
        /********************/
        
        // 判断左侧窗口是否要收缩
        while (window needs shrink) {
            // d 是将移出窗口的字符
            char d = s[left];
            // 左移窗口
            left++;
            // 进行窗口内数据的一系列更新
            ...
        }
    }
}

3、代码

class Solution {
    public String minWindow(String s, String t) {
        HashMap need = new HashMap<>();
        HashMap window = new HashMap<>();
        int isValible = 0;
        int left = 0, rigth = 0;
        int start = 0, len = Integer.MAX_VALUE;
        for(int i = 0; i < t.length(); i++){
            need.put(t.charAt(i), need.getOrDefault(t.charAt(i), 0) + 1);
        }
        while(rigth < s.length()){
            char c = s.charAt(rigth);
            rigth++;
            if(need.containsKey(c)){
                window.put(c, window.getOrDefault(c, 0) + 1);
                //注意用equals,不要用 ==
                if(window.get(c).equals(need.get(c))){
                    isValible++;
                }
            }

            while(isValible == need.size()){
                if(rigth - left < len){
                    start = left;
                    len = rigth - left;
                }
                char d = s.charAt(left);
                left++;
                if(need.containsKey(d)){
                    //主要要用equals
                    if(window.get(d).equals(need.get(d))){
                        isValible--;
                    }
                    window.put(d, window.getOrDefault(d, 0) - 1);
                }                
            }
        }
        return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);
    }
}

你可能感兴趣的:(LeetCode 76. 最小覆盖子串)