[滑动窗口] LeetCode 567. 字符串的排列

120 阅读1分钟

👉 “Offer 驾到,掘友接招!我正在参与2022春招打卡活动点击查看 活动详情

567. 字符串的排列

给定两个字符串 s1s2,写一个函数来判断 s2 是否包含 s1 的排列。 换句话说,第一个字符串的排列之一是第二个字符串的子串。

示例 1:

输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").

示例 2:

输入: s1= "ab" s2 = "eidboaoo"
输出: False

提示:

输入的字符串只包含小写字母
两个字符串的长度都在 [1, 10,000] 之间
  • 解题思路(滑动窗口)


    • 固定滑动窗口的大小为字符串s1的大小;

    • 分别使用计数数组AB记录字符串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