窗口的思路是存在一个窗口。满足条件,这时候扭转窗口的大小,到不满足条件时,挪动窗口的右边界线
int[] check = new int[size];//左边界int left =0;//右边界int right = 1;//这个时候就曾经初步创立了窗口freq[in.0] = init;//当初开始滑动窗口ans = init;while(right<in.len){ //当窗口不非法 while(check[in.right] is not valid){ //挪动窗口使窗口非法 check[in.(left++)] = !init; } //这个时候窗口非法 check[in.right] = init; ans = better(ans,right-left+1); right++;}rerurn ans;
套用公式
3. 无反复字符的最长子串
滑动窗口一道很典型的题。
int[] check = new int[127];//左边界int left =0;//右边界int right = 1;//这个时候就曾经初步创立了窗口freq[s.charAt(0)] = 1;//当初开始滑动窗口ans = 1;while(right<in.length()){ //当窗口不非法 while(check[in.s.charAt(right)] >0){ //挪动窗口使窗口非法 check[s.charAt(left++)]--; } //这个时候窗口非法 check[in.s.charAt(right)]++; ans = Math,max(ans,right-left+1); right++;}rerurn ans;
再用公式套用一个比较复杂的题目
30. 串联所有单词的子串
//窗口大小HashSet<String> validSet ; HashSet<String> inValidSet ; public List<Integer> findSubstring(String s, String[] words) { int size = words.length * words[0].length(); int left = 0; int right = size - 1; List<Integer> list = new ArrayList<>(); validSet = new HashSet<>(); inValidSet = new HashSet<>(); while (right < s.length()) { while (right<s.length() && !isValid(s, left, right,words)) { left++; right++; } if (right<s.length()){ list.add(left); left++; right++; } } return list; } private boolean isValid(String s,int left,int right,String[] words) { if (validSet.contains(s.substring(left,right+1))) return true; if (inValidSet.contains(s.substring(left,right+1))) return false; HashMap<String, Integer> map = new HashMap<>(); for (String word : words) { map.put(word, map.getOrDefault(word, 0) + 1); } while (left <= right) { String temp = s.substring(left, left + words[0].length()); Integer freq = map.getOrDefault(temp, 0); if (freq > 0) map.put(temp, freq - 1); else { inValidSet.add(s); return false; } left += words[0].length(); } validSet.add(s); return true; }
再比方,咱们再套一道题
187. 反复的DNA序列
这个题目稍为简略
class Solution { public List<String> findRepeatedDnaSequences(String s) { int left = 0; int right = 10; ArrayList<String> resp = new ArrayList<>(); HashMap<String, Integer> map = new HashMap<>(); while (right<=s.length()){ String temp = s.substring(left, right); map.put(temp,map.getOrDefault(temp,0)+1); right++; left++; } for (String k : map.keySet()) { if (map.get(k) > 1) { resp.add(k); } } return resp; }}