力扣刷题:567. 字符串的排列

题目:

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,第一个字符串的排列之一是第二个字符串的 子串 。

示例 1:

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

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

提示:

1 <= s1.length, s2.length <= 104
s1 和 s2 仅包含小写字母

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-in-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

滑动窗口:

用滑动窗口来解决这个问题。需要两个数列来计算当前s2的子数列里出现的字符数量是否和s1里的一样。首先在s2里从开始往右移动直到子数列和s1长度一样,这就是我们的窗口。后面我们只需要向右移动这个窗口就能遍历每一个可能的子数列并判断这个子数列是否是s1的子串。向右移动时,我们需要移除最左边的并加进最右边的值。

代码:

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        int s1Len = s1.size();
        int s2Len = s2.size();
        if (s1Len > s2Len)
        {
            return false;
        }

        vector<int> count1(26);
        vector<int> count2(26);

        for (int i = 0; i < s1Len; i++)
        {
            count1[s1[i]-'a'] += 1;
            count2[s2[i]-'a'] += 1;
        }

        if (count1 == count2)
        {
            return true;
        }

        for (int i = s1Len; i < s2Len; i++)
        {
            ++ count2[s2[i]-'a'];
            -- count2[s2[i-s1Len]-'a'];
            if (count1 == count2)
            {
                return true;
            }

        }
        return false;
    }
};

参考:

https://leetcode-cn.com/problems/permutation-in-string/

https://leetcode-cn.com/problems/permutation-in-string/solution/zi-fu-chuan-de-pai-lie-by-leetcode-solut-7k7u/


版权声明:本文为weixin_47109266原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。