
思路:
1. 設(shè)置一個(gè)閉開的集合[i, j);集合的長度為最后結(jié)果(j-i+1)
2. i為不重復(fù)子字符串的期待,每次遍歷j,擴(kuò)大集合的長度
3. 若在遍歷j的時(shí)候,出現(xiàn)重復(fù)字符,則新集合的開始為j+1;
4. ans,用來記錄每次集合的最大值
class Solution {
? ? public int lengthOfLongestSubstring(String s) {
? ? ? ? //新建數(shù)組, 用于包括所有ASCII碼的字符串
? ? ? ? int[] index = new int[128];
? ? ? ? int anw = 0;
//開始遍歷
? ? ? ? for(int i =0,j =0; j < s.length(); j++){
? ? ? ? ? ? //集合的起點(diǎn)
? ? ? ? ? ? i = Math.max(index[s.charAt(j)], i);
? ? ? ? ? ? //最終長度,為上一次長度或目前集合的最大值
? ? ? ? ? ? anw = Math.max(anw, j-i+1);
? ? ? ? ? ? //記錄當(dāng)前遍歷點(diǎn)的起點(diǎn)
? ? ? ? ? ? ? index[s.charAt(j)] = j + 1;
? ? ? ? }
? ? ? ? return anw;
? ? }
}

思路:
1. 用一個(gè)開放集合記錄可能的字符串(i,j)
2. 若符合條件,則j++;不符合條件i++;
3. 用一個(gè)count數(shù)組來記錄每個(gè)值出現(xiàn)的次數(shù)
4. 若字符串一樣,則subString的長度 - maxCount 不會大于k,j向右移
?5. 若長度不一樣,則會出現(xiàn)大于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;
? ? }