1. 程式人生 > 資訊 >中軟國際加入軟體綠色聯盟

中軟國際加入軟體綠色聯盟

技術標籤:LeetCodeleetcode字串子串

567. 字串的排列

難度 中等

給定兩個字串s1s2,寫一個函式來判斷s2是否包含s1的排列。換句話說,第一個字串的排列之一是第二個字串的子串。

這道題其實就是從s2中選取與s1等長的字串(如果長度都不相同, 那麼無論s1無論怎麼組合都不成的), 然後判斷其中的資料統計結果是不是一樣, 應該算是比較簡單的題,

我首先想到的就是將統計結果存到一個字典當中, 這裡容易忽略的一點就是當字典中某個鍵的值為0的時候是需要刪除這個鍵的

第一版程式碼

class Solution:
    def checkInclusion(self, s1, s2):
        size1 = len(s1)
        size2 = len(s2)
        if size1 > size2:
            return False

        d1 = {}
        for ch in s1:
            d1[ch] = d1.get(ch, 0) + 1

        left = 0
        right = size1 - 1
        d2 = {}
        for ch in s2[:size1]:
            d2[ch] = d2.get(ch, 0) + 1
        if d1 == d2:
            return True

        right += 1
        while right < size2:
            d2[s2[right]] = d2.get(s2[right], 0) + 1
            d2[s2[left]] = d2.get(s2[left]) - 1
            if d2[s2[left]] == 0:
                del d2[s2[left]]
            if d1 == d2:
                return True
            left += 1
            right += 1
        return False