本题用到了滑动窗口。
滑动窗口大致思想为,用变量left right 记录窗口的左下标和右下标,
先将窗口初始化,将left置为0,用map或者int[] 存储窗口中的left到right-1的出现的字符情况,然后从下标right开始向后遍历,将下标right的字符加入窗口,与结果比较,比较之后删除下标left的字符,将left++, right++。直到right到达字符串末尾。
public class Solution { public List<Integer> findAnagrams(String s, String p) { Map<Character, Integer> smap = new HashMap<>(); Map<Character, Integer> pmap = new HashMap<>(); List<Integer> res = new LinkedList<>(); int p_len = p.length(); int s_len = s.length(); if(p_len > s_len) return res; for(int i = 0; i < p_len-1; i++){ char c = s.charAt(i); smap.put(c, smap.getOrDefault(c, 0)+1); } for(char c: p.toCharArray()){ pmap.put(c, pmap.getOrDefault(c, 0)+1); } int left = 0; int right = p_len-1; while(right < s_len){ char c = s.charAt(right); smap.put(c, smap.getOrDefault(c, 0)+1); if(smap.equals(pmap)) res.add(left); char t = s.charAt(left); if(smap.get(t) == 1) smap.remove(t); //删除key else smap.put(t, smap.get(t)-1); left++; right++; } return res; } }