567. 字符串的排列 LeetCode Python 滑动窗口解法

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,第一个字符串的排列之一是第二个字符串的子串。

示例1:

输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
 

示例2:

输入: s1= "ab" s2 = "eidboaoo"
输出: False
 

注意:

输入的字符串只包含小写字母
两个字符串的长度都在 [1, 10,000] 之间

class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        # 这提其实就是判断 s1 是否是s2的一个子串
        need = {}
        window = {}
        t = len(s1)   # 由于有重复字符,所以这里记录下一共有字符串的长度
        for i in s1:
            if i in  need:
                need[i] += 1
            else:
                need[i] = 1


        start = 0 
        lenght = float("inf") # 子串的起始与长度
        left,right = 0,0 # 滑动窗口的两个指针
        valid = 0 

        # right 开始右移
        while(right < len(s2)):
            
            # 加入到窗口
            c = s2[right]
            if c not in window:
                window[c] = 1
            else:
                window[c] += 1
            right += 1
            if c in need:
                if window[c] == need[c]: # 判断这个字符在字串中是否足够
                    valid += 1
           
            while(right-left >= t):#判断窗口是否需要收缩
                if valid ==len(need):
                    return True
                v = s2[left]
                left += 1
                if v in need:  
                    if window[v] == need[v]:
                        valid -=1
                    window[v]-=1
        return False

 

posted @ 2020-12-26 21:14  地球守卫者  阅读(124)  评论(0编辑  收藏  举报