class Solution:
def checkInclusion(self, s1: str, s2: str) -> bool:
if not s1 and not s2:
return True
if not s1 or not s2:
return False
#计算s1和s2的长度
l1,l2 = len(s1),len(s2)
#对s1中的各个元素进行Counter计算
c1 = Counter(s1)
c2 = Counter()
l,r = 0,0
while r<l2:
#如果新元素没出现在字典中,进行更新
c2[s2[r]]+=1
#如果在窗口大小为l1的数组中,两个hash表相同,则返回True
if c1==c2:
return True
#移动右指针
r+=1
#维护一个大小为l1的窗口
if r-l+1>l1:
#左移的话,字典计算减1
c2[s2[l]]-=1
#如果计算减1之后为0,则删掉c2字典中的元素
#因为{'a':0,'b':1}!={'b':1}
if c2[s2[l]]==0:
del c2[s2[l]]
#同时移动左右指针
l+=1
return False
- 先判断是不是为空,如果不为空,那就用滑动窗口法去做
- 思想:维护一个和s1大小相同的滑动窗口,然后判断在这个窗口内字符出现的次数是不是相同,如果相同那就说明s2是包含s1的
- 先声明两个字典,一个字典是s1计算,一个空字典,是用来对s2中的元素进行计数
- 首先更新c2字典,然后在判断是不两个字典相同,如果不同就移动右指针
- 然后判断当前窗口是不是比较大于l1,如果是那就左移一个单位,并且减去字典中的count
- 如果while循环内都不满足,那就说明s2不包含s1,直接返回False就可以了
#年前最后一刷