May LeetCoding Challenge17 之 滑动窗口

本题用到了滑动窗口。

滑动窗口大致思想为,用变量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;
    }
}

猜你喜欢

转载自www.cnblogs.com/yawenw/p/12939820.html
今日推荐