滑动窗口
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;
    }
}