Sliding Window模板
public int slidingWindowTemplate(String s, String t) {
Map<Character, Integer> map = new HashMap<>();
int result = 0;
int counter = map.size();// 用count来track当前的滑动窗口是否valid
int start = 0, i = 0; // [start...i]维护一个滑动窗口
while(i < s.length()){
char c1 = s.charAt(c1);
if( map.containsKey(c1) ){
map.put(c1, map.get(c1)+1);
if(map.get(c) == 1) counter++;
}
i++;
while(counter == 0){ //当前滑动窗口生态被打破,寻找下个有效的滑动窗口
char c2 = s.charAt(start);
if(map.containsKey(c2)){
map.put(c2, map.get(c2) - 1);//plus or minus one
if(map.get(tempc) == 0) counter--;
}
start++;
}
//随时更新结果
result = Math.max(result, i - start);
}
return result;
}
Sliding Window高频题:
[leetcode]76. Minimum Window Substring最小字符串窗口
public String minWindow(String s, String t) {
int[] mapT = new int[256];
int[] mapS = new int[256];
String result = "";
if(s.length() < t.length()) return result;
for(int i = 0; i < t.length(); i++){
char c1 = t.charAt(i);
mapT[c1] ++;
}
int count = 0;
int start = 0;
for(int i = 0; i < s.length(); i++){
char c2 = s.charAt(i);
mapS[c2]++;
if(mapT[c2] >= mapS[c2]){
count++;
}
if(count == t.length()){
while(mapS[s.charAt(start)] > mapT[s.charAt(start)]){
mapS[s.charAt(start)]--;
start++;
}
if( result == "" || i - start + 1 < result.length()){
result = s.substring(start, i+1);
}
}
}
return result;
}
[leetcode]3. Longest Substring Without Repeating Characters无重复字母的最长子串
[leetcode]159. Longest Substring with At Most Two Distinct Characters至多包含两种字符的最长子串
public int lengthOfLongestSubstringTwoDistinct(String s) {
int result = 0;
int start = 0, i = 0;
Map<Character, Integer> map = new HashMap<>();
int count = 0;
while(i < s.length()){
char c = s.charAt(i);
map.put(c, map.getOrDefault(c,0) +1);
if(map.get(c) == 1) count++;
i++;
while(count > 2){
char c2 = s.charAt(start);
map.put(c2, map.get(c2) -1);
if(map.get(c2) == 0){
count --;
}
start++;
}
result = Math.max(result, i - start);
}
return result;
}
[leetcode]340. Longest Substring with At Most K Distinct Characters至多包含K种字符的最长子串