📜  门| GATE-CS-2015(套装1)|第 55 题(1)

📅  最后修改于: 2023-12-03 15:28:44.308000             🧑  作者: Mango

题目描述

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

其中,s1的所有字符都在s2中循环出现过且长度相等。

例如,当s1为"abc"时,s2为"eidbaooo",函数应该返回true。而当s1为"abc"时,s2为"eidboaoo",则函数应该返回false。

函数原型为:

bool checkInclusion(string s1, string s2);
输入格式

第一行输入一个字符串s1。

第二行输入一个字符串s2。

输出格式

输出一个布尔值,表示s2是否包含s1的排列。

输入样例1
abc
eidbaooo
输出样例1
1
输入样例2
abc
eidboaoo
输出样例2
0
算法

滑动窗口算法。

代码
bool checkInclusion(string s1, string s2) {
    vector<int> hash(26, 0);
    for (char c : s1) hash[c - 'a']++;

    int l = 0, r = 0, count = s1.size();

    while (r < s2.size()) {
        if (hash[s2[r] - 'a'] > 0) count--;
        hash[s2[r] - 'a']--;
        r++;

        if (count == 0) return true;

        if (r - l == s1.size()) {
            if (hash[s2[l] - 'a'] >= 0) count++;
            hash[s2[l] - 'a']++;
            l++;
        }
    }

    return false;
}
复杂度

时间复杂度:O(n)

空间复杂度:O(n)

参考文献