📅  最后修改于: 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的排列。
abc
eidbaooo
1
abc
eidboaoo
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)