leetcode滑动窗口题集

╄→尐↘猪︶ㄣ 提交于 2019-12-10 14:28:48

滑动窗口是一类题目,虽然其中有的题目可以有其他的或者更简单的解法,但是作为一个通用解法,我们在有限的时间里还是可以用的,具体在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;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!