424. 替换后的最长重复字符
滑动窗口
记录下当前窗口出现最多的元素的数量,其他的元素在有限次数下能否变成它
int n = s.length();
if(n < 2) {
return n;
}
char[] sArray = s.toCharArray();
int left = 0, right = 0;
int ans = 0;
int max = 0;
int[] cur = new int[26];
while(right < n) {
cur[sArray[right] - 'A']++;右边界扩大
max = Math.max(max, cur[sArray[right] - 'A']);记录出现最多次数的元素的个数
right++;
if((right - left) > (max + k)) {如果当前窗口的长度,大于能得到的相同字串,则抛弃,左边界收缩
cur[sArray[left] - 'A']--;
left++;
}
ans = Math.max(ans, right - left);
}
return ans;
438. 找到字符串中所有字母异位词
由题意可得,我的窗口长度时固定的
只需要看每个窗口是否符合即可
3. 无重复字符的最长子串
答案就在相邻的两个相同字符之间
Map<Character, Integer> map = new HashMap<>();
int ans = 0;
int left = 0;
for(int i = 0; i < s.length(); i++) {
if(map.containsKey(s.charAt(i))) {
left = Math.max(left, map.get(s.charAt(i)) + 1);此处采用左边界右移一格,达到左闭右闭[left, right]。是为了避免此种情况
}
map.put(s.charAt(i), i);
ans = Math.max(ans, i - left + 1);
}
return ans;