String---滑動窗口

思路:

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;

? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容