class Solution {
public:
bool checkInclusion(string s1, string s2) {
int pFreq[26];
int winFreq[26]; //记录s2中字符出现频率
int right = 0;
int left = 0;
int pcount = 0; //s1中字符种类数
int wincount = 0; //s2中字符种类数(只有当s2中该字符出现频率与s1中该字符出现频率相同时,自加)
for(int i = 0; i < 26; i++){
pFreq[i] = 0;
winFreq[i] = 0;
}
for(int i = 0; i < s1.length(); i++){
pFreq[s1[i]-'a']++; //存储s1中每个字符出现的频率
}
for(int i = 0; i < 26; i++){
if(pFreq[i] > 0)
pcount++; //存储出现的字符种类数
}
while(right < s2.length()){
if(pFreq[s2[right]-'a'] > 0){ //如果s2右指针指向的字符存在于s1中
winFreq[s2[right]-'a']++; //winFreq数组中该字符数加1
if(pFreq[s2[right]-'a'] == winFreq[s2[right]-'a']){ //如果s2中该字符出现频率与s1相同
wincount++; //s2字符种类数加1
}
}
right++; //指针右移
while(pcount == wincount){ //如果s1与s2字符种类数相同
if(right - left == s1.length()) //且s2子串长度与s1相同
return true; //说明找到满足条件字符串
if(pFreq[s2[left]-'a'] > 0){ //如果左指针指向的字符存在于s1中
winFreq[s2[left]-'a']--; //winFreq数组中该字符减1(因为左指针左移,剔除该字符)
if(winFreq[s2[left]-'a'] < pFreq[s2[left]-'a']){ //如果s2中该字符出现频率小于s1
wincount--; //s2字符种类数减1
}
}
left++; //左指针左移
}
}
return false;
}
};
567.字符串的排列(滑动窗口+双指针) 难度:中等 语言:C++
最新推荐文章于 2025-05-19 09:37:08 发布