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: The answer must be a substring, “pwke” is a subsequence and not a substring.

## Solution

from typing import List

class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
begin, end = 0, len(s)
startPos, longest = 0, 0
chars = [False] * 128

while begin < end:
ch = ord(s[begin])
if not chars[ch]:
chars[ch] = True
begin += 1
else:
longest = max(longest, begin - startPos)
while chars[ch]:
startPosCh = ord(s[startPos])
chars[startPosCh] = False
startPos += 1
return max(longest, begin - startPos)


## Test Cases

test = Solution()
assert test.lengthOfLongestSubstring("abcabcbb") == 3
assert test.lengthOfLongestSubstring("bbbbb") == 1
assert test.lengthOfLongestSubstring("pwwkew") == 3
assert test.lengthOfLongestSubstring("") == 0
assert test.lengthOfLongestSubstring("a") == 1
assert test.lengthOfLongestSubstring(" ") == 1
print('All Passed!')


## Big O Analysis

Space Complexity: O(1)

Time Complexity: O(N)