滑动窗口是一类题目,虽然其中有的题目可以有其他的或者更简单的解法,但是作为一个通用解法,我们在有限的时间里还是可以用的,具体在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;
}
来源:CSDN
作者:Herbzhou
链接:https://blog.csdn.net/csdnnmbdybb/article/details/103474284