目錄
- 題目
- 題解:滑動視窗
題目
- 給你兩個字串 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