2月-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が含まれます。
    • 最初に2つの辞書を宣言し、1つの辞書はs1によって計算され、空の辞書はs2の要素をカウントするために使用されます
    • 最初にc2辞書を更新し、次に2つの辞書が同じであるかどうかを判断します。異なる場合は、右のポインターを移動します。
    • 次に、現在のウィンドウがl1より大きいかどうかを判別し、大きい場合は、ウィンドウを1単位左に移動し、辞書のカウントを減算します。
    • whileループで満たされない場合は、s2にs1が含まれていないことを意味し、Falseを直接返します。

#前の最後のブラシ

おすすめ

転載: blog.csdn.net/weixin_37724529/article/details/113780567