菜鸟什么时候才能变成老鸟,欢迎留言纠错~|

Shie1d

园龄:5年9个月粉丝:6关注:0

76. 最小覆盖子串(困难)


核心思想
滑动窗口,先从头开始找到包含t的子串,然后缩短窗口左边界,直到不包含再扩展右边界。
匹配过程:
s = "ADOBECODEBANC", t = "ABC"
匹配:"ADOBEC"
缩短:"DOBEC"
匹配:"DOBECODEBA"
缩短:"ODEBA"
匹配:"ODEBANC"
缩短:"ANC"
缩短过程中记录答案
代码

public String minWindow(String s, String t) {
        int res = s.length() + 1, resL = -1, resR = -1;
        HashMap<Character, Integer> vs = new HashMap();
        HashMap<Character, Integer> vt = new HashMap();
        for(int i = 0; i < t.length(); i++){
            vt.put(t.charAt(i), vt.getOrDefault(t.charAt(i), 0) + 1);
        }
        int cnt = 0, target = t.length();
        for(int l = 0, r = 0; r < s.length(); r++){
            vs.put(s.charAt(r), vs.getOrDefault(s.charAt(r), 0) + 1);
            if(vs.get(s.charAt(r)) <= vt.getOrDefault(s.charAt(r), 0)){
                cnt++;
            }
            if(cnt == target){
                while(true){
                    if(r - l + 1 < res){
                        res = Math.min(res, r - l + 1);
                        resL = l;
                        resR = r;
                    }
                    char ch = s.charAt(l);
                    vs.put(ch, vs.get(ch) - 1);
                    l++;
                    if(vs.get(ch) < vt.getOrDefault(ch, 0)){
                        cnt--;
                        break;
                    }
                }
            }
        }
        return resL == -1? "": s.substring(resL, resR + 1);
    }
}

本文作者:Shie1d

本文链接:https://www.cnblogs.com/ganyq/p/18109079

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Shie1d  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起