滑动窗口总结
滑动窗口总结
解决数组/字符串的子元素问题
class Solution {
public int lengthOfLongestSubstring(String s) {
// 滑动窗口
Set<Character> occ = new HashSet<>();
int n = s.length();
int rk = -1, ans = 0;
for (int i = 0; i < n; i++) {
if(i != 0) {
occ.remove(s.charAt(i-1));
}
while (rk+1 < n && !occ.contains(s.charAt(rk+1))) {
occ.add(s.charAt(rk+1));
rk++;
}
ans = Math.max(ans, rk+1 - i);
}
return ans;
}
}
class Solution {
public boolean checkInclusion(String s1, String s2) {
// 滑动窗口
int n1 = s1.length(), n2 = s2.length();
if ( n1 > n2 ) return false;
int[] cnt1 = new int[26]; // 统计 s1 字符个数
int[] cnt2 = new int[26]; // 统计 滑动窗口 字符个数
for (int i = 0; i < n1; i++) {
cnt1[s1.charAt(i)-'a']++;
cnt2[s2.charAt(i)-'a']++;
}
if( Arrays.equals(cnt1, cnt2)) return true;
for (int i = n1; i < n2; i++) {
cnt2[s2.charAt(i)-'a']++;
cnt2[s2.charAt(i-n1)-'a']--;
if( Arrays.equals(cnt1, cnt2)) return true;
}
return false;
}
}

浙公网安备 33010602011771号