1. 程式人生 > 其它 >Leetcode #567 字串的排列

Leetcode #567 字串的排列

技術標籤: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為指向。