---
# System prepended metadata

title: Medium－3. Longest Substring Without Repeating Characters
tags: [Java, Medium, LeetCode]

---

###### tags: `LeetCode`,`Java`,`Medium`
# Medium－3. Longest Substring Without Repeating Characters
### **題目連結：** [**Longest Substring Without Repeating Characters**](https://leetcode.com/problems/longest-substring-without-repeating-characters/description/)

### **解題方向** 
* 題目要求找出最長的不重複字串長度，所以可以使用滑動窗口的方式來處理。
* 使用 Set 紀錄目前窗口中出現過的字元，如果加入的字元已經在 Set 中存在，就從 Set 中移除窗口最左邊的字元，直到該字元不存在 Set 中。
* 用一個變數 max 來記錄目前最長的不重複字串長度，每次更新時計算目前窗口的長度。
* 窗口的左右端點分別使用 left 和 right 來記錄，初始值都為 0。
* 迴圈從右邊端點開始遍歷，每次遍歷時先檢查當前右邊端點所對應的字元是否存在 Set 中，如果存在就移除最左邊的字元，直到該字元不存在 Set 中為止。
* 每次更新 max 的值時，使用 Math.max 函數比較當前 max 的值和目前窗口的長度哪一個更大，然後將較大的值賦給 max 變數。
* 最後返回 max 變數即可。
### **完整程式碼**
```java=
class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet();
        int max = 0;
        int left = 0;
        for (int right = 0; right < s.length(); right++) {
            while(!set.add(s.charAt(right))) {
                set.remove(s.charAt(left++));
            }
            max = Math.max(max, right - left + 1);
        }
        return max;
    } 
}
```
