美文网首页
LeetCode 76. 最小覆盖子串

LeetCode 76. 最小覆盖子串

作者: 陈陈chen | 来源:发表于2021-10-05 17:29 被阅读0次

    1、题目

    image.png

    2、分析

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

    /* 滑动窗口算法框架 */
    void slidingWindow(string s, string t) {
        unordered_map<char, int> 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<Character, Integer> need = new HashMap<>();
            HashMap<Character, Integer> 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. 最小覆盖子串

          本文链接:https://www.haomeiwen.com/subject/xkygnltx.html