一、题目内容
二、题目分析+代码
class Solution {
public boolean checkInclusion(String s1, String s2) {
// 边界条件,判断返回
if(s1.length()>s2.length())
return false;
// 因为都是小写字母,所以只需要开一个26的数组记录每个字符出现的次数即可
int[]cnt1=new int [26];
int[]cnt2=new int [26];
// 先将s1的全部放入cnt1中,再将s2的前s1.length()个放入cnt2中,然后从左到右遍历s2
for(int i=0;i<s1.length();i++){
cnt1[s1.charAt(i)-'a']++;
cnt2[s2.charAt(i)-'a']++;
}
// 最好的情况是s2的前s1.length()个正好等于s1,直接返回true即可
if(Arrays.equals(cnt1,cnt2))
return true;
// 从第s1.length()个到第s2.length()个,每次从右边加入一个,左边取出一个
// 可以保证字符串长度不变且连续,如果此时发现s1和s2的某个子串相等
// 就返回true,遍历完都不相等,就返回false
for(int i=s1.length();i<s2.length();i++){
cnt2[s2.charAt(i)-'a']++;
cnt2[s2.charAt(i-s1.length())-'a']--;
if(Arrays.equals(cnt1,cnt2))
return true;
}
return false;
}
}
三、小总结
1.一般这种滑动窗口关于字符串的题目常常使用HashMap或者长度为26的数组计数。
2.滑动窗口类所有题目的关键都在于左右窗口边界的移动。
3.有的滑动窗口也可以使用动态规划和回溯代替。