leetcode_567 字符串的排列

101 阅读1分钟

要求

给你两个字符串 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 仅包含小写字母

核心代码

from itertools import permutations
class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        if len(s1) > len(s2):
            return False
        record = collections.Counter(s1)
        length = len(s1)
        win = {}
        l = 0
        rst = False

        for r,c in enumerate(s2):
            if c not in record.keys():
                win.clear()
                l = r + 1
            else:
                win[c] = win.get(c,0) + 1
                if r - l + 1 == length:
                    if win == record:
                        rst = True
                    win[s2[l]] -= 1
                    l += 1
        return rst

image.png

解题思路:我们对s1进行字符统计,然后我们使用滑动窗口,当我们在s2中遇到一个字符在s1中的时候,我们使用,当迭代到我们的长度和s1长度相同的时候,我们看下两个统计字典是否相同,巧妙的将全排列问题改成统计字符数量相同的问题,比较好的一道题。