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;
}
}