---
tags: data_structure_python
---
# Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.
**Example 1:**
```
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
```
**Example 2:**
```
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
```
**Example 3:**
```
Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
```
---
**Rephrase question:**
What is the longest substring which can be formed from the input, where all characters in the substring are unique? There may be multiple substrings of the same length.
```
Input. "abcabcbb"
Output. 3
Explanation. The longest substring is of length 3. Longest substrings include "abc", "bca", and "cab".
```
```
Input. "pwwkew"
Output. 3
Explanation. The longest substring is of length 3. Longest substrings include "wke" and "kew".
```
# Solution
## Solution 1: Sliding window not optimized.
```python=
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# Time complexity: O(n*k) with k = size of substring.
# Space complexity: O(1).
n = len(s)
if n < 2:
return n
else:
res, beg = 0, 0
for end in range(1, n):
while s[end] in s[beg:end]:
beg+=1
res = max(res, end-beg+1)
return res
```
## Solution 2: Sliding window optimized (Hashmap)
```python=
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# Time complexity: O(n).
# Space complexity: O(m) with size of hashmap.
if len(s) < 2:
return len(s)
else:
hashmap = {} # {char: index}
res, beg = 0, 0
for end, char in enumerate(s):
if char in hashmap and beg <= hashmap[char]:
beg = hashmap[char]+1
res = max(res, end-beg+1)
hashmap[char] = end
return res
```
## Solution 3: Sliding window optimized (Table)
```python=
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# Time complexity: O(n).
# Space complexity: O(256) = O(1).
if len(s) < 2:
return len(s)
else:
table = [-1]*256 # Extended ASCII table.
res, beg = 0, 0
for end, char in enumerate(s):
if table[ord(char)] != -1 and beg <= table[ord(char)]:
beg = table[ord(char)]+1
res = max(res, end-beg+1)
table[ord(char)] = end
return res
```