题目
Given two strings s1 and s2, write a function to return true if s2 contains the permutation of s1. In other words, one of the first string’s permutations is the substring of the second string.
Example 1:
Input: s1 = “ab” s2 = “eidbaooo”
Output: True
Explanation: s2 contains one permutation of s1 (“ba”).
Example 2:
Input:s1= “ab” s2 = “eidboaoo”
Output: False
Constraints:
The input strings only contain lower case letters.
The length of both given strings is in range [1, 10,000].
滑动窗口
使用前后指针表示窗口。
需要注意的是,l 缩小窗口只需窗口大小大于 s1.size() ,而且当发现 valid == len(need)时,就说明窗口中就是一个合法的排列,应立即返回 true。
python代码
class Solution(object):
def checkInclusion(self, s1, s2):
"""
:type s1: str
:type s2: str
:rtype: bool
"""
need = dict()
windows = dict()
for i in s1:
if i in need:
need[i] += 1
else:
need[i] = 1
for i in s2:
windows[i] = 0
l ,r = 0,0
valid = 0
while r < len(s2):
c = s2[r]
r += 1
if c in need:
windows[c] += 1
if windows[c] == need[c]:
valid += 1
while r - l >= len(s1):
if valid == len(need):
return True
d = s2[l]
l += 1
if d in need:
if windows[d] == need[d]:
valid -= 1
windows[d] -= 1
return False