--- title: '3. Longest Substring Without Repeating Characters' description: Given a string s, find the length of the longest substring without duplicate characters icon: dot topics: - { name: "Hash Table", slug: "hash-table" } - { name: "String", slug: "string" } - { name: "Sliding Window", slug: "sliding-window" } video: "wiGpQwVHdE0" issue: "https://github.com/prdlk/leetcode/issues/51" companies: - { name: "Ola Cabs", period: "Thirty Days", frequency: 100 } - { name: "Visa", period: "Thirty Days", frequency: 100 } - { name: "Amazon", period: "Thirty Days", frequency: 84.9 } - { name: "Microsoft", period: "Thirty Days", frequency: 75.6 } - { name: "Bloomberg", period: "Thirty Days", frequency: 69.8 } - { name: "Meta", period: "Thirty Days", frequency: 63.8 } - { name: "Google", period: "Thirty Days", frequency: 63.7 } - { name: "tcs", period: "Thirty Days", frequency: 58.2 } - { name: "Cognizant", period: "Three Months", frequency: 100 } - { name: "Optum", period: "Three Months", frequency: 100 } - { name: "Spotify", period: "Three Months", frequency: 100 } - { name: "Deloitte", period: "Three Months", frequency: 89.1 } - { name: "Infosys", period: "Three Months", frequency: 87.4 } - { name: "Apple", period: "Three Months", frequency: 69 } - { name: "Goldman Sachs", period: "Three Months", frequency: 66.3 } - { name: "Media.net", period: "Six Months", frequency: 100 } - { name: "Wipro", period: "Six Months", frequency: 100 } - { name: "Wissen Technology", period: "Six Months", frequency: 100 } - { name: "Zoho", period: "Six Months", frequency: 100 } - { name: "Qualcomm", period: "Six Months", frequency: 92 } - { name: "Turing", period: "Six Months", frequency: 89 } - { name: "EPAM Systems", period: "Six Months", frequency: 86.7 } - { name: "Netflix", period: "Six Months", frequency: 83.1 } - { name: "Tesla", period: "Six Months", frequency: 80.9 } - { name: "Yandex", period: "Six Months", frequency: 69.2 } - { name: "Agoda", period: "Six Months", frequency: 65 } - { name: "IBM", period: "Six Months", frequency: 60.1 } - { name: "LinkedIn", period: "Six Months", frequency: 54.1 } sidebar: label: 'Longest Substring Without Repeating Characters' badge: 'Medium' --- ### 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 ```