https://leetcode-cn.com/problems/permutation-in-string/
思路:如果
s
2
s_2
s2包含
s
1
s_1
s1的排列,那么必定存在一个
s
2
s_2
s2的字串
s
s
s,
s
s
s中任意字符的出现次数一定等于
s
1
s_1
s1中对应字符的出现次数。转换到这一步就比较好搞了,当然暴力做还是会超时的,正解是滑动窗口。首先用
c
n
t
cnt
cnt数组记录
s
1
s_1
s1中每个字符的出现次数,然后令
l
=
r
=
0
l=r=0
l=r=0(窗口的边界),我们不断移动右边界(入窗),当某个时候出现
c
n
t
[
s
2
[
r
]
−
′
a
′
]
<
0
cnt[s_2[r]-'a']<0
cnt[s2[r]−′a′]<0时(不满足要求了),就需要移动左边界(出窗)。
class Solution {
public:
bool checkInclusion(string s1, string s2) {
vector<int> cnt(26,0);
for(char ch:s1)
++cnt[ch-'a'];
int l=0,r=0,siz1=s1.size(),siz2=s2.size();
while(r<siz2){
//r入窗
--cnt[s2[r]-'a'];
//不符合题意 l出窗
while(cnt[s2[r]-'a']<0)
++cnt[s2[l++]-'a'];
r++;
if(r-l==siz1)
return 1;
}
return 0;
}
};