2022.3.12
class Solution {
public boolean checkInclusion(String s1, String s2) {
//1.计算s1的各字符出现的次数,即挖坑
int n = s1.length(), m = s2.length();
if (n > m) {
return false;
}
int[] cnt = new int[26];
for (int i = 0; i < n; ++i) {
--cnt[s1.charAt(i) - 'a'];
}
//双指针,可以理解为右指针每走一步就填一次坑
int left = 0;
for (int right = 0; right < m; ++right) {
int x = s2.charAt(right) - 'a';
++cnt[x];
//如果有某个字符多了,就说明填坑填错了了,让左指针从头开始重新挖坑,直到地面平了位置
while (cnt[x] > 0) {
--cnt[s2.charAt(left) - 'a'];
++left;
}
//可以理解为右指针每走一步就填一次坑,填了n次也没有填错,那就刚好
if (right - left + 1 == n) {
return true;
}
}
return false;
}
//滑动窗口
// public boolean checkInclusion(String s1, String s2) {
// int n1 = s1.length();
// int n2 = s2.length();
// if(n1 > n2) return false;
// int[] ctn1 = new int[26];
// int[] ctn2 = new int[26];
// for(int i =0;i<n1;i++){
// ctn1[s1.charAt(i) - 'a']++;
// ctn2[s2.charAt(i) - 'a']++;
// }
// if(Arrays.equals(ctn1,ctn2)) return true;
// for(int i = n1;i < n2;i++){
// ctn2[s2.charAt(i) - 'a']++;
// ctn2[s2.charAt(i-n1) - 'a']--;
// if(Arrays.equals(ctn1,ctn2)) return true;
// }
// return false;
// }
}
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set = new HashSet<Character>();
int n = s.length();
int rk = 0,res = 0;
//精髓就是找规律
for(int i = 0;i < n;i++){
if(rk != 0){ //如果重复了就从下一个字符开始
set.remove(s.charAt(i-1));
}
while(rk < n && !set.contains(s.charAt(rk)) ){//不重复就放入,rk不能超界
set.add(s.charAt(rk ));
rk++;
}
res = Math.max(res,rk+-i);
}
return res;
}
}