滑动窗口
import java.util.*; public class Solution { public ArrayList<Integer> findWord (String s, String p) { HashMap<Character,Integer> window = new HashMap<>(); HashMap<Character,Integer> need = new HashMap<>(); for(char c:p.toCharArray()){ need.put(c,need.getOrDefault(c,0)+1); } int valid = 0; ArrayList<Integer> res = new ArrayList<>(); int left=0,right=0; while(right < s.length()){ char c = s.charAt(right); right++; if(need.containsKey(c)){ window.put(c,window.getOrDefault(c,0)+1); if(window.get(c).equals(need.get(c))){ valid++; } } if(right-left == p.length()){ if(valid == need.size()){ res.add(left); } char ch = s.charAt(left); left++; if(window.containsKey(ch)){ if(window.get(ch).equals(need.get(ch))){ valid--; } window.put(ch,window.get(ch)-1); } } } return res; } }