leetcode76. Minimum Window Substring

class Solution {
    public String minWindow(String s, String t) {
        int[] map = new int[128];
        for(Character ch : t.toCharArray()){
            map[ch]++;
        }
        //定义counter来计数,begin/end作为滑动窗口的两端,d表示滑动窗口长度,head来记录满足条件的起始位置,len表示s字符串长度
        int counter = t.length();
        int begin = 0, end = 0, head = 0, d = Integer.MAX_VALUE;
        int len = s.length();
        while(end < len){
            //若遇到与t字符串中相同元素,计数减一
            if(map[s.charAt(end)] > 0){
                counter--;
            }
            //该元素计数减一
            map[s.charAt(end)]--;
            //滑动窗口右端后移
            end++;
            //直到窗口内包含t中所有元素
            while(counter == 0){
                //若当前滑动窗口长度较小,则记录当前滑动窗口的长度及起始位置
                if(end - begin < d){
                    d = end - begin;
                    head = begin;
                    //进一步优化一下,如果当前滑动窗口大小与t子串长度一样长,直接返回结果即可。
                    if(d == t.length()){
                        return s.substring(head, head + d);
                    }
                }
                //重新调整滑动窗口
                if(map[s.charAt(begin)] == 0){  
                    counter++;
                }
                //恢复状态
                map[s.charAt(begin)]++;
                //滑动窗口左端向右侧移动
                begin++;
            }
        }
        return d == Integer.MAX_VALUE ? "" : s.substring(head, head + d);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值