基本思路:
这道题是典型的滑动窗口问题
定义两个数组arr1,arr2。因为题目两个字符串都是由英文字母组成,所以长度都是26。
我们要用这两个数组arr1储存s1字符串中各个字符的个数,arr2储存当前遍历子串中各个字符的个数
把s1的长度n当作滑动窗口的长度,遍历s2中每个长度为n的字串。
得到的arr2判断与arr1是否相等
代码实现:
class Solution {
public boolean checkInclusion(String s1, String s2) {
//定义两个字符串的长度分别为n,m
int n = s1.length();
int m = s2.length();
//当n的长度大于m时,返回false
if(n > m){
return false;
}
//使用两个数组arr1和arr2
//arr1统计s1字符串中各个字符的个数,
//arr2统计当前遍历子串中各个字符的个数
int[] arr1 = new int[26];
int[] arr2 = new int[26];
//把s1的长度n当作滑动窗口的长度,遍历s2中每个长度为n的子串
for(int i = 0;i < n;i ++){
++arr1[s1.charAt(i) - 'a'];
++arr2[s2.charAt(i) - 'a'];
}
if(Arrays.equals(arr1,arr2)){
return true;
}
//滑动窗口,每向右移动一次就多统计一次进入窗口的字符,少统计一次离开窗口的字符
for(int i = n;i < m;i ++){
++arr2[s2.charAt(i) - 'a'];
--arr2[s2.charAt(i - n) - 'a'];
if(Arrays.equals(arr1,arr2)){
return true;
}
}
return false;
}
}