1. 程式人生 > 實用技巧 >3. [陣列][滑動視窗]無重複字元的最長子串

3. [陣列][滑動視窗]無重複字元的最長子串

3. 無重複字元的最長子串

方法一:滑動視窗

\(slideEnd(滑動視窗的右側)\)每次只需要從上次的位置繼續開始後移即可,因為如果在\([i, slideEnd]\)之間沒有重複的字元,那麼在\([i+1, slideEnd]\)之間也不會有重複的字串。

在判斷是否出現重複字元時可以改用Set判斷,因為子串不含重複字元,正好滿足Set的特性,可以使用HashSet減少查詢開銷,當然,可以進一步優化為使用布林陣列用於字元是否出現的記錄。

// 執行耗時:3 ms,擊敗了96.75% 的Java使用者
// 記憶體消耗:38 MB,擊敗了99.80% 的Java使用者

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int maxLength = 0;
        int slideEnd = 0;
        boolean isAppear[] = new boolean[128];
        for (int i = 0; i < s.length(); i++){
            while (slideEnd < s.length() && !isAppear[s.charAt(slideEnd)]){
                isAppear[s.charAt(slideEnd)] = true;
                slideEnd++;
            }
            maxLength = Math.max(maxLength, slideEnd - i);
            isAppear[s.charAt(i)] = false;
        }
        return maxLength;
    }
}