【LeetCode】567. 字符串的排列
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int n1=s1.size(),n2=s2.size();
if(n1>n2)
return false;
vector<int> count1(26),count2(26);
for(int i=0;i<n1;++i)
{
++count1[s1[i]-'a'];
}
int left,right,start=-1;
for(int j=0;j<=n2-n1;++j) //构造第一个滑动窗口
{
if(count1[s2[j]-'a'])
{
start=j;
for(int k=0;k<n1;++k)
{
++count2[s2[j+k]-'a'];
}
if(count1!=count2)
{
break;
}
else
return 1;
}
}
if(start!=-1) //若有满足条件的滑动窗口,则继续构建
for(int j=start+1;j<=n2-n1;++j)
{
--count2[s2[j-1]-'a'];
++count2[s2[j+n1-1]-'a'];
if(count1!=count2)
{
continue;
}
return 1;
}
return 0;
}
};
使用计数数组比较字符串是否相等,而不是重新排列后对比。注意窗口滑动时的改变。

浙公网安备 33010602011771号