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