滑动窗口问题一般都是一个字符串匹配s1另一个 字符串s2的问题。滑动窗口的问题一般分成一下几个步骤走:
1,记录下字符串s1中的字符mp1
2,使用双指针的形式遍历字符串s2,同时记录下遍历的字符mp2
3,在遍历字符串的过程中,没次移动都比较一下mp1和mp2是否想通了,想通了就认为是匹配成功了。
窗口大小不固定
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/c869adea70321e6ce51c5012d008a278.png
class Solution {
public:
bool judge(map<char,int> mp1,map<char ,int> mp2)
{
int flag=0;
map<char ,int>::iterator it=mp1.begin();
for(;it!=mp1.end();it++)
{
if(it->second!=mp2[it->first])
{
flag=1;
break;
}
}
if(flag==1) return false;
else return true;
}
string minWindow(string s, string t) {
map<char,int> vecs;
map<char,int> vect;
int ans=0;
for(int i=0;i<t.size();i++)
{
vect[t[i]]++;
}
int left=0;
int right=0;
int Min=10000000,start=0;
while(right<s.size())
{
vecs[s[right]]++;
while(judge(vect,vecs))
{
if(right-left+1<Min)
{
start=left;
Min=right-left+1;
}
vecs[s[left]]--;
left++;
}
right++;
}
return Min==10000000?"":s.substr(start,Min);
}
};
窗口大小固定
class Solution {
public:
map<char,int> mps1;
map<char,int> mps2;
bool judge(map<char,int> mp1,map<char ,int> mp2)
{
int flag=0;
map<char ,int>::iterator it=mp1.begin();
for(;it!=mp1.end();it++)
{
if(it->second!=mp2[it->first])
{
flag=1;
break;
}
}
if(flag==1) return false;
else return true;
}
bool checkInclusion(string s1, string s2) {
if(s1=="") return true;
else if(s1!=""&&s2=="" ) return false ;
if(s1.size()>s2.size()) return false ;
// vector<int> mps1(26);
// vector<int> mps2(26);
for(int i=0;i<s1.size();i++)
{
mps1[s1[i]]++;
mps2[s2[i]]++;
// mps1[s1[i]-'a']++;
// mps2[s2[i]-'a']++;
}
int right=s1.size();
int left=0;
if(mps1==mps2)
{
return true;
}
while(right<s2.size())
{
mps2[s2[right]]++;
mps2[s2[left]]--;
// mps2[s2[right]-'a']++;
// mps2[s2[left]-'a']--;
if(judge(mps1,mps2)) return true;
right++;
left++;
}
return false;
}
};
class Solution {
public:
bool judge(map<char,int> mp1,map<char ,int> mp2)
{
int flag=1;
map<char ,int>::iterator it=mp1.begin();
for(;it!=mp1.end();it++)
{
if(it->second!=mp2[it->first])
{
flag=0;
break;
}
}
if(flag==0) return false;
else return true;
}
vector<int> findAnagrams(string s, string p) {
map<char,int> mps;
map<char,int>mpp;
// vector<int> mps(26);
// vector<int> mpp(26);
vector<int> v;
if(p.size()>s.size()||s.size()==0) return v;
for(int i=0;i<p.size();i++)
{
mpp[p[i]]++;
mps[s[i]]++;
// mpp[p[i]-'a']++;
// mps[s[i]-'a']++;
}
int left=0,right=p.size();
if(judge(mpp,mps))
{
v.push_back(left);
}
// if(mps==mpp)
// {
// v.push_back(left);
// }
while(right<s.size())
{
// mps[s[right++]-'a']++;
// mps[s[left++]-'a']--;
mps[s[right++]]++;
mps[s[left++]]--;
if(judge(mpp,mps))
{
v.push_back(left);
}
// if(mps==mpp)
// {
// v.push_back(left);
// }
}
return v;
}
};