class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        #Edge
        if not s:
            return 0

        start, max_length, hash = 0, 0, {}

        for i, num in enumerate(s):
            # Need to have the following condition:
            # start <= hash[num] to avoid edge case such as :
            # "tmmzuxt"
            if num in hash and start <= hash[num]:
                #update pointer
                start = hash[num] + 1
            else:
                max_length = max(max_length, i - start + 1)

            hash[num] = i

        return max_length

23427fd8a16605c00b13ec0d0bfb333422a9e112
<mask token>

class Solution(object):
    <mask token>

class Solution(object):

    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s:
            return 0
        start, max_length, hash = 0, 0, {}
        for i, num in enumerate(s):
            if num in hash and start <= hash[num]:
                start = hash[num] + 1
            else:
                max_length = max(max_length, i - start + 1)
            hash[num] = i
        return max_length

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        #Edge
        if not s:
            return 0

        start, max_length, hash = 0, 0, {}

        for i, num in enumerate(s):
            # Need to have the following condition:
            # start <= hash[num] to avoid edge case such as :
            # "tmmzuxt"
            if num in hash and start <= hash[num]:
                #update pointer
                start = hash[num] + 1
            else:
                max_length = max(max_length, i - start + 1)

            hash[num] = i

        return max_length
