LeetCode-Python-567. 字符串的排列(滑动窗口)

文章描述了一个编程问题,如何使用Python实现一个名为Solution的类方法,检查字符串s2是否包含字符串s1的所有排列。通过滑动窗口技术和Counter字典,解决在s2中查找s1字符频率匹配的问题,时间复杂度为O(M+N),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

换句话说,s1 的排列之一是 s2 的 子串 。

示例 1:

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

示例 2:

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

提示:

  • 1 <= s1.length, s2.length <= 104
  • s1 和 s2 仅包含小写字母

思路:

题意等价于在 s 里找一个滑动窗口,使得此滑动窗口的 Counter 等于 t 的 Counter。

这里的 Counter 就是字符到频率的一个 mapping 字典。

所以解答是标准滑动窗口三步法:

1. 让右指针向右一步,新字符入队

2. 调整左指针,去掉不必要或者不合适的部分。这道题是不合适。

3. 尝试刷新答案

时间复杂度: O(M + N)

空间复杂度:O(1)

class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        c1, c2 = Counter(s1), Counter()
        left = 0
        for right, char in enumerate(s2):
            # enqueue char
            c2[char] += 1

            # adjust left
            while left < right and c2[s2[left]] > c1[s2[left]]:
                c2[s2[left]] -= 1
                left += 1

            # refresh res
            if c1 == c2:
                return True
        return False

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值