给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的 子串 。
示例 1:
输入: s1 = “ab” s2 = “eidbaooo”
输出: True
解释: s2 包含 s1 的排列之一 (“ba”).
示例 2:
输入: s1= “ab” s2 = “eidboaoo”
输出: False
提示:
- 输入的字符串只包含小写字母
- 两个字符串的长度都在 [1, 10,000] 之间
思路
首先对s1中的字符进行数量统计,然后扩大窗口,如果是s1中的字符,对数量进行减1,如果不是,判断当前窗口是否符合要求,符合返回如果不符合对减掉的字符进行加回,最后窗口到达最右端,无法继续扩大,则进行判断是否符合要求,返回true或者false
实现代码
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int left = 0,right = 0,record[26] = {0};
for(int i = 0;i < s1.size();i ++) //对s1中字符出现的数量进行统计
record[s1[i] - 'a']++;
while(right < s2.size()){
if(record[s2[right] - 'a'] > 0) //滑动的右窗口为s2中的字符,将其数量减1
record[s2[right] - 'a'] --;
else{
if(s1.size() == right -left) //如果当前的窗口符合s2,返回true
return true;
if(left!=right){ //不符合,对减掉的数重新加回
record[s2[left] - 'a']++;
right --;
}
left++; //缩减左窗口
}
right++; //扩大右窗口
}
for(int i = 0;i < 26;i++){ //如果数量仍存在不为0的元素,则返回false
if(record[i] != 0)
return false;
}
return true;
}
};