滑动窗口
bool f(string a,string b)
{
vector<int> num(25,0);
int nonZero=0;
for(int i=0;i<b.size();++i)
{
if(++num[b[i]-'a']==1)++nonZero;
}
for(int i=0;i<b.size();++i)
{
int c=a[i]-'a';
--num[c];
if(num[c]==0)--nonZero;
else if(num[c]==-1)++nonZero;
}
if(nonZero==0)return true;
//旧窗口a[i-b.size()..i-1]
//新窗口a[i-b.size()+1..i]
for(int i=b.size();i<a.size();++i)
{
//删除a[i-b.size()]
int c=a[i-b.size()]-'a';
++num[c];
if(num[c]==0)--nonZero;
else if(num[c]==1)++nonZero;
//添加a[i]
c=a[i]-'a';
--num[c];
if(num[c]==0)--nonZero;
else if(num[c]==-1)++nonZero;
if(nonZero==0)return true;
}
return false;
}