zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Atcoder Beginner Contest075 翻车记
    bzoj1972 猪国杀 大♂模拟
    10月9-11日连续大翻车实录
    10月8日翻车实录
    10月7日考试翻车实录
    四月は君の嘘?人生は君の嘘?
    NOIP模拟 gcd 数学
    NOIP模拟 water 最小生成树
    NOIP模拟 mine DP
    bzoj2064 分裂 状压DP
  • 原文地址:https://www.cnblogs.com/huangguifeng/p/14194200.html
Copyright © 2011-2022 走看看