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