
思路:
1. 设置一个闭开的集合[i, j);集合的长度为最后结果(j-i+1)
2. i为不重复子字符串的期待,每次遍历j,扩大集合的长度
3. 若在遍历j的时候,出现重复字符,则新集合的开始为j+1;
4. ans,用来记录每次集合的最大值
class Solution {
public int lengthOfLongestSubstring(String s) {
//新建数组, 用于包括所有ASCII码的字符串
int[] index = new int[128];
int anw = 0;
//开始遍历
for(int i =0,j =0; j < s.length(); j++){
//集合的起点
i = Math.max(index[s.charAt(j)], i);
//最终长度,为上一次长度或目前集合的最大值
anw = Math.max(anw, j-i+1);
//记录当前遍历点的起点
index[s.charAt(j)] = j + 1;
}
return anw;
}
}

思路:
1. 用一个开放集合记录可能的字符串(i,j)
2. 若符合条件,则j++;不符合条件i++;
3. 用一个count数组来记录每个值出现的次数
4. 若字符串一样,则subString的长度 - maxCount 不会大于k,j向右移
5. 若长度不一样,则会出现大于k的情况,i向右移
public int characterReplacement(String s, int k) {
int len = s.length();
//只有大写英文字母
int[] count = new int[26];
int start = 0, maxCount = 0, maxLength = 0;
for (int end = 0; end < len; end++) {
//记录每次不一样字母的最大值
maxCount = Math.max(maxCount, ++count[s.charAt(end) - 'A']);
while (end - start + 1 - maxCount > k) {
//将开始字符右移
count[s.charAt(start) - 'A']--;
start++;
}
//记录每一次变化的长度
maxLength = Math.max(maxLength, end - start + 1);
}
return maxLength;
}