👉 “Offer 驾到,掘友接招!我正在参与2022春招打卡活动点击查看 活动详情。
567. 字符串的排列
给定两个字符串
s1和s2,写一个函数来判断s2是否包含s1的排列。 换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例 1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
示例 2:
输入: s1= "ab" s2 = "eidboaoo"
输出: False
提示:
输入的字符串只包含小写字母
两个字符串的长度都在 [1, 10,000] 之间
-
解题思路(滑动窗口)
-
固定滑动窗口的大小为字符串
s1的大小; -
分别使用计数数组
A和B记录字符串s1和窗口内字符出现的次数; -
若
A == B说明窗口内的字符个数和字符串s1的字符个数相同,返回true。
-
| C++版本 |
class Solution {
public:
bool checkInclusion(string s1, string s2) {
vector<int> A(26,0),B(26,0);
for(auto x : s1) A[x - 'a']++;
int n = s2.size(),m = s1.size();
for(int l = 0,r = 0; r < n; r++){
if(r - l + 1 > m){ //当区间大于窗口的时候,收缩左边界
B[s2[l++] - 'a']--;
}
B[s2[r] - 'a']++;
if(A == B) return true; //如果元素和出现的次数相同,则直接返回true
}
return false;
}
};
| Python版本 |
class Solution:
def checkInclusion(self, s1: str, s2: str) -> bool:
A,B = [0]*26,[0]*26
for x in s1:
A[ord(x) - ord('a')] += 1
l,r = 0,0
while r < len(s2):
if r - l + 1 > len(s1):
B[ord(s2[l]) - ord('a')] -= 1
l += 1
B[ord(s2[r]) - ord('a')] += 1
if A == B:
return True
r += 1
return False