---
title: '3. Longest Substring Without Repeating Characters'
description: Given a string s, find the length of the longest substring without duplicate characters
sidebar:
  label: 'Longest Substring Without Repeating Characters'
  badge: 'Medium'
---

Hash Table

### Example 1:
- Input: `s = "abcabcbb"`
- Output: `3`
- Explanation: The answer is "abc", with the length of `3`. Note that "bca" and "cab" are also correct answers.

### Example 2:
- Input: `s = "bbbbb"`
- Output: `1`
- Explanation: The answer is "b", with the length of `1`.

### Example 3:
- Input: `s = "pwwkew"`
- Output: `3`
- Explanation: The answer is "wke", with the length of `3`. Notice that the answer must be a substring, "pwke" is a subsequence and not a substring.

### Constraints:

- `0 <= s.length <= 10^5`
- `s` consists of English letters, digits, symbols and spaces.

## Approach

```mermaid
flowchart TD
  S(["lengthOfLongestSubstring(s)"]) --> I["left = 0, ans = 0, window = set()"]
  I --> L{"more (right, c) in s?"}
  L -- no --> E(["return ans"])
  L -- yes --> W{"c already in window?"}
  W -- yes --> P["window.remove(s[left]); left += 1 — shrink until c is free"]
  P --> W
  W -- no --> A["window.add(c)"]
  A --> M["ans = max(ans, right - left + 1)"]
  M --> L
```

## Solution

```py
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        left = 0
        ans = 0
        window = set()
        for right, c in enumerate(s):
            while c in window:
                window.remove(s[left])
                left += 1
            window.add(c)
            ans = max(ans, right - left + 1)

        return ans
```

## Explanation

[Longest Substring Without Repeating Characters - Leetcode 3 - Python](https://www.youtube.com/watch?v=wiGpQwVHdE0)
