Leetcode #567 字串的排列
阿新 • • 發佈:2021-02-11
技術標籤:Leetcode-筆記leetcodepython字串
目錄
題目描述
給定兩個字串 s1 和 s2,寫一個函式來判斷 s2 是否包含 s1 的排列。
換句話說,第一個字串的排列之一是第二個字串的子串
。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/permutation-in-string/
示例1:
輸入: s1 = "ab" s2 = "eidbaooo" 輸出: True 解釋: s2 包含 s1 的排列之一 ("ba").
示例2:
輸入: s1= "ab" s2 = "eidboaoo"
輸出: False
注意:
- 輸入的字串只包含小寫字母
- 兩個字串的長度都在 [1, 10,000] 之間
解題思路
篩選條件: s2的某個子串 == s1的排列之一。
思路:
- 如果s2的某個子串 == s1的排列之一,那s2的該子串長度與s1的
長度一定相等
。 - 長度相等後,如果s2子串中每個
字元出現的頻率與s1相同
,那可以肯定s2的該子串一定是s1的排列之一。 - 長度相等,需要遍歷,本題為
視窗大小固定的滑動視窗問題
,需要左右指標輔助遍歷。
所以篩選條件可以理解為:
- len(s2的某個子串) == len(s1)
- Counter(s1) == Counter(s2的某個子串)
我的程式碼
class Solution(object):
def checkInclusion(self, s1, s2):
# 思路:長度相等 + 每個字元出現頻率相同 = 符合條件
# 記下s1中字元出現的個數
counter1 = Counter(s1)
# 由題知,是視窗大小固定的滑動視窗問題,因此定義左右兩指標
left, right = 0, len(s1) - 1
# 記下s2中兩指標之間的字元出現的個數,用於判斷字元出現頻率是否與s1相同
counter2 = Counter(s2[left: right]) # 注意這裡左閉右開
while right < len(s2):
counter2[s2[right]] += 1 # 將右指標指向加入視窗
if counter1 == counter2: # 符合條件
return True
# 不符合條件時,需要右移視窗,但移動之前要將left所指的元素的個數 -1
counter2[s2[left]] -= 1
# 特別地,當left所指元素的個數為0時,需要刪除該節點,{"a": 0,"b": 1}和{"b": 1}是不一樣的
if counter2[s2[left]] == 0:
del counter2[s2[left]]
# 正式地,移動視窗
left += 1
right += 1
return False
心得
- 對字典的操作還不熟練。
- {“a”: 0,“b”: 1}和{“b”: 1}是不一樣的。
- {“a”: 0,“b”: 1}與{“b”: 1,“a”: 0}是一個意思,字典以key為指向。