题目
https://leetcode-cn.com/problems/permutation-in-string/
分析
思路是 s2的字串和s1拥有相同的字符种类和次数。
winCount,表示滑动窗口在 s2 上滑动的时候,出现在 s1 中的字符的种类数。
代码
class Solution {
public boolean checkInclusion(String s1, String s2) {
int len1=s1.length();
int len2=s2.length();
char[] p=s1.toCharArray();
char[] t=s2.toCharArray();
int[] pf=new int[26];
int[] tf=new int[26];
int p_count=0;
//统计s1中字符出现次数
for(char c:p){
pf[c-'a']++;
}
//统计s1中字符种类数
for(int i=0;i<26;i++){
if(pf[i]>0)
p_count++;
}
int left=0;
int right=0;
int winCount=0;//s2中满足条件的字符种类数
while(right<len2){
//s1中存在的字符
if(pf[t[right]-'a']>0){
//s2中此字符次数+1
tf[t[right]-'a']++;
//字符出现次数相等
if(pf[t[right]-'a']==tf[t[right]-'a']){
winCount++;
}
}
right++;
//s2子串中种类数=s1中种类数
while(winCount==p_count){
//s2字串长度=s1字串长度,找到了
if(right-left==len1){
return true;
}
//左指针右移
if(pf[t[left]-'a']>0){
tf[t[left]-'a']--;
if(tf[t[left]-'a']<pf[t[left]-'a'])
winCount--;
}
left++;
}
}
return false;
}
}