567. 字串的排列(中)

Frommoon發表於2024-03-12

目錄
  • 題目
  • 題解:滑動視窗

題目

  • 給你兩個字串 s1 和 s2 ,寫一個函式來判斷 s2 是否包含 s1 的排列。如果是,返回 true ;否則,返回 false 。
    換句話說,s1 的排列之一是 s2 的 子串

示例 1:

輸入:s1 = "ab" s2 = "eidbaooo"
輸出:true
解釋:s2 包含 s1 的排列之一 ("ba").

示例 2:

輸入:s1= "ab" s2 = "eidboaoo"
輸出:false

題解:滑動視窗

class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        need={}# 儲存字串 t 中各個字元的需求量
        window={}# 儲存滑動視窗中各個字元的出現次數
        for c in s1:#遍歷字串t
            need.setdefault(c,0)#訪問不存在的鍵時自動建立並將值設定為 0
            need[c]+=1# 統計字串 t 中各個字元的需求量
        left=0# 滑動視窗的左指標
        right=0# 滑動視窗的右指標
        valid=0# 記錄滿足需求的字元數
        while right<len(s2):
            c=s2[right]# 當前字元
            right+=1# 右指標右移
            if c in need:#當前字元是目標字元中的
                window.setdefault(c,0)#訪問不存在的鍵時自動建立並將值設定為 0
                window[c]+=1# 更新滑動視窗中當前字元的出現次數
                if window[c]==need[c]:# 如果滑動視窗中當前字元的出現次數達到需求量,增加滿足需求的字元數
                    valid+=1
            while right -left>=len(s1):#當視窗大小大於s1時
                if valid == len(need):#每個字元的次數都達到了要求
                    return True
                d=s2[left] # 將要移出視窗的字元
                left+=1# 左指標右移
                if d in need:#當前字元是目標字元中的
                    if window[d]== need[d]:#如果滑動視窗中當前字元等於目標字元的值
                        valid-=1# 如果移出視窗的字元導致視窗不再滿足需求,則減少滿足需求的字元數
                    window[d]-=1# 更新滑動視窗中移出字元的出現次數
        return False

相關文章