February——567.字符串的排列

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就可以了

#年前最后一刷

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/113780567
今日推荐