首页 > 编程语言 > 详细

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

时间:2020-12-27 02:18:29      阅读:35      评论:0      收藏:0      [点我收藏+]

给定两个字符串 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

 

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

原文:https://www.cnblogs.com/huangguifeng/p/14194200.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!