问题描述
给你两个字符串
s1
和s2
,写一个函数来判断s2
是否包含s1
的排列。如果是,返回true
;否则,返回false
。换句话说,
s1
的排列之一是s2
的 子串 。
示例
示例 1:
输入:s1 = "ab" s2 = "eidbaooo" 输出:true 解释:s2 包含 s1 的排列之一 ("ba").示例 2:
输入:s1= "ab" s2 = "eidboaoo" 输出:false提示:
1 <= s1.length, s2.length <= 10^4
s1
和s2
仅包含小写字母
问题分析:
记录一道标准的滑动窗口问题,这题的思路类似“438. 找到字符串中所有字母异位词”,同样是维护一个大小为26的vector数组即可(因为字符串只有小写字母)。接着就是无脑开滑。
代码如下:
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int n = s1.size();
if(s2.size() < n) return false;
vector<int> s1_count(26, 0);
vector<int> s2_count(26, 0);
for(int i = 0; i < n; ++i){
s1_count[s1[i] - 'a'] ++;
s2_count[s2[i] - 'a'] ++;
}
if(s1_count == s2_count) return true;
for(int i = 0; i < s2.size() - n; ++i){
// 开滑!!!
s2_count[s2[i] - 'a'] --;
s2_count[s2[i + n] - 'a'] ++;
if(s1_count == s2_count) return true;
}
return false;
}
};