概述
15题和14题的思路类似都是采用滑动串口的方法
方法分析
-
为什么不采用为运算 mask |=1<<(s1[i]-‘a’) 呢?因为这里需要检测重复字母,eg.s1=“aab”;所以这里采用 vectorcnt(26) 容器,记录26个字母中,每个字母出现的次数:++cnt[s1[i]-‘a’],这样就知道一个字母出现了多少次。
-
为什么使用滑动窗口?
首先这里窗口的长度是不变的(基串p的长度),就代表high指针不需要前移。
思路
用
c
n
t
[
x
]
=
c
n
t
2
[
x
]
−
c
n
t
1
[
x
]
cnt[x]=cnt2[x]-cnt1[x]
cnt[x]=cnt2[x]−cnt1[x]来表示基串s和p的子串s2中x字母的个数是否相同,相同cnt[x]==0,当子串上x字母多了个,则+1,反之则-1;并用diff记录字母不同的个数。
用滑动窗口遍历p的所有可能子串,滑动一次,一进(x)一出(y),若进之前,cnt[x]==0,进之后,cnt[x]=1了,字母不同的个数多一个,diff+1;若进之后使得cnt[x]==0,则字母不同数少一个,diff-1。出字母同理。