This technique shows how a nested for loop in few problems can be converted to single for loop and hence reducing the time complexity.
Template
publicclassSolution {publicList<Integer> slidingWindowTemplateByHarryChaoyangHe(String s,String t) {//init a collection or int value to save the result according the question.List<Integer> result =newLinkedList<>();if(t.length()>s.length()) return result;//create a hashmap to save the Characters of the target substring.//(K, V) = (Character, Frequence of the Characters)Map<Character,Integer> map =newHashMap<>();for(char c :t.toCharArray()){map.put(c,map.getOrDefault(c,0) +1); }//maintain a counter to check whether match the target string.int counter =map.size();//must be the map size, NOT the string size because the char may be duplicate.//Two Pointers: begin - left pointer of the window; end - right pointer of the windowint begin =0, end =0;//the length of the substring which match the target string.int len =Integer.MAX_VALUE; //loop at the begining of the source stringwhile(end <s.length()){char c =s.charAt(end);//get a characterif( map.containsKey(c) ){map.put(c,map.get(c)-1);// plus or minus oneif(map.get(c) ==0) counter--;//modify the counter according the requirement(different condition). } end++;//increase begin pointer to make it invalid/valid againwhile(counter ==0/* counter condition. different question may have different condition */){char tempc =s.charAt(begin);//***be careful here: choose the char at begin pointer, NOT the end pointerif(map.containsKey(tempc)){map.put(tempc,map.get(tempc) +1);//plus or minus oneif(map.get(tempc) >0) counter++;//modify the counter according the requirement(different condition). }/* save / update(min/max) the result if find a target*/// result collections or result int value begin++; } }return result; }}