567. 字符串的排列(leetcode)

https://leetcode.cn/problems/permutation-in-string/description/

class Solution {
    public boolean checkInclusion(String S1, String S2) {
        // 看数据范围以及感觉,是双指针,固定窗口大小s1.length
        // 
        int[] cntS1=new int[128];
        int[] cntS2=new int[128];
        char[] s1=S1.toCharArray();
        char[] s2=S2.toCharArray();
        if(s2.length<s1.length)return false;
        for(int i=0;i<s1.length;i++)
        {
            cntS1[s1[i]]++;
            cntS2[s2[i]]++;
        }
        if(check(cntS1,cntS2))return true;
        for(int i=s1.length;i<s2.length;i++)
        {
            // 更新窗口信息
            cntS2[s2[i]]++; // 右指针右移
            cntS2[s2[i-s1.length]]--; // 左指针右移
            if(check(cntS1,cntS2))return true;
        }
        return false;
    }

    // 判断是否包含对应排列
    boolean check(int[] cntS1,int[] cntS2)
    {
        // s2子串出现的字符次数要等于s1每个字符出现的次数
        for(int i='a';i<='z';i++)
            if(cntS1[i]!=cntS2[i])return false;
        return true;
    }
}

 

posted @ 2024-10-06 03:16  风乐  阅读(11)  评论(0)    收藏  举报