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)