leetcode滑动窗口题集

滑动窗口是一类题目,虽然其中有的题目可以有其他的或者更简单的解法,但是作为一个通用解法,我们在有限的时间里还是可以用的,具体在leetcode中有几题,有人已经总结了,而且说的很好

leetcode滑动窗口解决

我这几题都是用java来写的,在用java写的过程中呢,遇到一些问题,比如非常容易忽视的问题,Integer类型的,要用equals方法比较大小,否则当数值大于127的时候会出错。

以最小覆盖字串为例,模板中必有的成分是left,right,needs,windows,match,另外注意两个while循环,一个right++,left++;

注意match-- 处的注解

public String minWindow(String s, String t) {
    String result ="";
    int left = 0;
    int right = 0;
    int minLength = Integer.MAX_VALUE;
    int resultLeft= 0;
    int resultRight = 0;
    int match = 0;
    HashMap<Character,Integer>needs = new HashMap<>();
    HashMap<Character,Integer>windows = new HashMap<>();
    for(int i=0;i<t.length();i++){
        char tem = t.charAt(i);
        needs.put(tem,needs.getOrDefault(tem,0)+1);
    }
    while(right<s.length()){
        char rchar = s.charAt(right);
        if(!needs.containsKey(rchar)) {
            right++;
            continue;
        }else{
            windows.put(rchar,windows.getOrDefault(rchar,0)+1);
            if(windows.get(rchar).equals(needs.get(rchar))){
                match++;
            }
            while(match==needs.size()){
                //System.out.println(left+" "+right);
                if(minLength > right - left +1){
                    resultLeft = left;
                    resultRight = right;
                    minLength = right - left+1;
                   // System.out.println(resultLeft+" "+resultRight);
                }
                char lchar = s.charAt(left);
                if(windows.containsKey(lchar)){
                    //如果连续相同字母,match会减去两次,但实际上,减去一次后,while循环就停止了
                    windows.put(lchar,windows.get(lchar)-1);
                    if(windows.get(lchar)<needs.get(lchar))
                        match--;
                    if(windows.get(lchar)==0)
                        windows.remove(lchar);
                }
                left++;
            }
        }
        right++;
    }
    if(minLength == Integer.MAX_VALUE)
        return result;
    result = s.substring(resultLeft,resultRight+1);
  //  System.out.println(resultLeft+" "+resultRight);
    return result;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值