滑动窗口模板

注意:这里区间用的是左闭右开:[left, right)

void slidingWindow(String s) {
    // 1、选合适的数据结构,记录窗口数据
    HashMap<Character, Integer> window = new HashMap<>();
    int left = 0, right = 0;
    while (right < s.length()) {
        // 2、右指针先动,移入窗口
        char c = s.charAt(right);
        window.put(c, window.getOrDefault(c, 0) + 1);
        // 这里的联动与记忆不同,用的是左开右比把
        right++;
        ...
        // 3、判断左指针是否要移动
        while (left < right && window needs shrink) {
            char d = s.charAt(left);
            window.put(d, window.get(d) - 1);
            left++;
            ...
        }
    }
}

一道变化题

567. 字符串的排列

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。

示例1:
输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").

示例2:
输入:s1= "ab" s2 = "eidboaoo"
输出:false
说明:1 <= s1.length, s2.length <= 104

public boolean checkInclusion(String s1, String s2) {
    // 统计s1的字母个数
    Map<Character,Integer> targetMap = new HashMap<>();
    for(char target : s1.toCharArray()){
        // TODO 这个+1千万别忘记啊
        targetMap.put(target,targetMap.getOrDefault(target,0)+1);    
    }
    
    Map<Character,Integer> windowMap = new HashMap<>();
    int mapLen = 0;
    int left=0,right=0;
    while(right<s2.length()){
        char rightCurr = s2.charAt(right);
        if(targetMap.containsKey(rightCurr)){
            windowMap.put(rightCurr, windowMap.getOrDefault(rightCurr,0)+1);
            // Integer比较必须要用equals
            if(windowMap.get(rightCurr).equals(targetMap.get(rightCurr))){
                mapLen++;
                // 目标值对比 要记住map是有size的
                if(mapLen == targetMap.size()) return true;
            }
        }
        right++;
        // 判断左指针移动,这里标准应该用>= 
        while(right-left == s1.length()){
            char leftCurr = s2.charAt(left);
            if(targetMap.containsKey(leftCurr)){
                if(windowMap.get(leftCurr).equals(targetMap.get(leftCurr))) mapLen--;
                windowMap.put(leftCurr, windowMap.get(leftCurr)-1);
            }
            left++;
        }
    }
  return false;
}
posted on 2023-09-26 09:10  大元王保保  阅读(7)  评论(0编辑  收藏  举报