题目
我的题解
class Solution {
public boolean checkInclusion(String s1, String s2) {
int left = 0;
int right = 0;
// 记录s1字母
int[] fre = new int[26];
Set<Integer> flag = new HashSet<>();
for (int i = 0; i < s1.length(); i++) {
fre[s1.charAt(i) - 'a']++;
flag.add(s1.charAt(i) - 'a');
}
while (right < s2.length()) {
char cur = s2.charAt(right);
fre[cur - 'a']--;
right++;
while (match(fre, flag)) {
char lost = s2.charAt(left);
fre[lost - 'a']++;
left++;
if (judge(fre)) {
return true;
}
}
}
return false;
}
// 判断窗口内是否只剩s1字母
private boolean judge(int[] fre) {
for (int j : fre) {
if (j < 0) {
return false;
}
}
return true;
}
// 判断s1的字母是否都在s2中出现
private boolean match(int[] fre, Set<Integer> flag) {
for (int index : flag) {
if (fre[index] > 0) {
return false;
}
}
return true;
}
}
其他题解
这是一个固定长度的窗口,不需要两个指针。
查看解法链接。