567. 字符串的排列
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,第一个字符串的排列之一是第二个字符串的子串。

示例1:

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

示例2:

输入: s1= "ab" s2 = "eidboaoo"
输出: False
运行结果
图片说明
解题思路
相当于固定窗口的大小为s1的长度(这样符合要求时,绝对不含有其他元素)
之后将窗口进行滑动判断结果即可
java代码

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        Map<Character,Integer> window=new HashMap<>();
        Map<Character,Integer> need=new HashMap<>();
        for(int i=0;i<s1.length();i++){
            char c=s1.charAt(i);
            need.put(c,need.getOrDefault(c,0)+1);
        }
        int vaild=0;
        int left=0;
        int right=0;
        while(right < s2.length()){
            //右移
            char ch=s2.charAt(right);
            right++;
            if(need.containsKey(ch)){
                window.put(ch,window.getOrDefault(ch,0)+1);
                if(window.get(ch).equals(need.get(ch))){
                    vaild++;
                }
            }
            //左移:当窗口等于s1时就左移(不能含有其他的元素)
            while(right-left>=s1.length()){
                //左移前判断结果
                if(vaild == need.size()){
                    return true;
                }
                char lch=s2.charAt(left);
                left++;
                if(need.containsKey(lch)){
                    if(window.get(lch).equals(need.get(lch))){
                        vaild--;
                    }
                    window.put(lch,window.get(lch)-1);
                }
            }
        }
        return false;

    }
}