classSolution{publicList<Integer>findAnagrams(String s2,String s1){List<Integer> res =newArrayList<Integer>();HashMap<Character,Integer> need=newHashMap<>();HashMap<Character,Integer> window =newHashMap<>();for(char c:s1.toCharArray()){
need.put(c,need.getOrDefault(c,0)+1);}int valid =0;int left =0;int right =0;while(right<s2.length()){char c = s2.charAt(right);
right++;if(need.containsKey(c)){
window.put(c,window.getOrDefault(c,0)+1);if(window.get(c).equals(need.get(c))){
valid++;}}else{
left=right;
window.clear();
valid=0;}while(right-left>=s1.length()){if(valid==need.size()){
res.add(left);}char d = s2.charAt(left);
left++;if(need.containsKey(d)){if(window.get(d).equals(need.get(d)))
valid--;
window.put(d, window.getOrDefault(d,0)-1);}}}return res;}}
3. 无重复字符的最长子串
right是一定要进去的,不需要额外的判断,直接放进去
classSolution{publicintlengthOfLongestSubstring(String s){Map<Character,Integer> window =newHashMap<>();int left =0;int right =0;int len =0;while(right<s.length()){char c = s.charAt(right);
window.put(c, window.getOrDefault(c,0)+1);
right++;while(window.get(c)>1){char d = s.charAt(left);
window.put(d, window.getOrDefault(d,0)-1);
left++;}
len =Math.max(len, right-left);}return len;}}