3. [陣列][滑動視窗]無重複字元的最長子串
阿新 • • 發佈:2020-10-25
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; } }