---
# System prepended metadata

title: '**Leetcode筆記(Longest Substring Without Repeating Characters)**'
tags: [string, medium, leetcode]

---

# **Leetcode筆記(Longest Substring Without Repeating Characters)**


:::info
:information_source: 題目 : Longest Substring Without Repeating Characters, 類型 : string , 等級 : medium
日期 : 2023/03/04，2023/05/10，2023/06/27，2023/09/21，2023/12/03，2024/02/20，2025/02/25
:::


### 嘗試

時間複雜度O(n)，空間複雜度O(n)

```python
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        wordSet = set()
        maxList = []
        maxnum = 0

        for i in range(len(s)):
            wordSet.add(s[i])
            if s[i] in wordSet:
                maxList.append(len(wordSet))
                wordSet.clear()
        return max(maxList)
```
2023/05/10
```python
# set語法
set.remove()
set.add()

# 因為要substring 所以一定是連在一起的
# 毛毛蟲移動法
# 前頭碰到一樣的就收後尾


class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        
        record = set()
        res = 0
        l = 0

        for r in range(len(s)):
            while s[r] in record:
                # 收後尾
                record.remove(s[l])
                l += 1
            # 探前頭
            record.add(s[r])
            res = max(res, r - l + 1)
        
        return res
```
2023/06/27
毛毛蟲移動法(用於substring)，前頭碰到一樣的就收後尾
有r, l ，如果r遇到重複的字母，l則會往回縮直到重覆字母不見
```python
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        record = set()
        length = 0
        l = 0
        for r in range(len(s)):
            while s[r] in record:
                record.remove(s[l])
                l += 1
            record.add(s[r])
            length = max(length, (r - l) + 1)
        
        return length
```
2023/09/21
改用r去往前延伸
```python
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        record = set()
        l, r = 0, 0
        maxLen = 0

        while r < len(s):
            while r < len(s) and not s[r] in record:
                record.add(s[r])
                r += 1

            maxLen = max(maxLen, r - l)
            record.remove(s[l])
            l += 1
        
        return maxLen
```
2023/12/03
```python
"""
s = "abcabcbb"

l, r = 0, 0
maxRes = 
set
while r < len(s):
    while s[r] in set:
        pop out s[l]
    set.add(s[r])
    update the maxRes
"""

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        maxRes = 0
        record = set()
        l, r = 0, 0
        while r < len(s):
            while s[r] in record:
                record.remove(s[l])
                l += 1
            record.add(s[r])
            r += 1
            if len(record) > maxRes:
                maxRes = len(record)
        
        return maxRes
```
2024/02/20
```python
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        l, r = 0, 0
        visited = set()
        maxL = 0

        while r < len(s):
            while s[r] in visited:
                visited.remove(s[l])
                l += 1
                
            print(visited)
            visited.add(s[r])
            maxL = max(maxL, r - l + 1)
            r += 1
        
        return maxL
```
2025/02/25
```python
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        res = 0
        l, r = 0, 0
        record = set()

        while r < len(s):
            while s[r] in record:
                record.remove(s[l])
                l += 1
            record.add(s[r])
            res = max(res, r - l + 1)
            r += 1
            
        return res
```

---
### **優化**

時間複雜度O(n)，空間複雜度O(n)

```python
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        wordSet = set()
        l = 0
        maxLen = 0

        for i in range(len(s)):
            while s[i] in wordSet: # 反覆執行直到重複的都被拿掉
                wordSet.remove(s[l])
                l += 1
            wordSet.add(s[i])
            maxLen = max(maxLen, len(wordSet))

        return maxLen
```
---


**:warning: 錯誤語法** 
:::warning
while代表重複執行
:::


**:thumbsup:學習** 
:::success
sliding_window:用一個指標去追蹤與更新
若這個set的第n個字被移走後，要記得n+1
:::

**思路**


**講解連結**
https://www.youtube.com/watch?v=wiGpQwVHdE0
Provided by. NeetCode

###### tags: `string` `medium` `leetcode`