3. 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.      

Code:

class solution:
# @param {string} s
# @return {integer}
def lengthOfLongestSubstring(self, s):
    # substring开始节点和最长substring设为0
    start = len_max = 0
    # dictionary存储已经出现过的char,和其最近出现位置
    char_dict = {}
    # 开始遍历
    for i in range(len(s)):
        # s[i]在字典中出现过,并且子串起始位置在最近这个字符出现位置之前或一致,此时为重复字符
        if s[i] in char_dict and start <= char_dict[s[i]]:
            #该重复字符出现位置后设为新子串起始位置
            start = char_dict[s[i]] + 1
        # 字典中未出现过的新字符,或者新子串中未出现过的字符,为子串中字符
        else:
            # 实时比较至该字符为止的新子串,与之前最长子串长度对比
            len_max = max(len_max, i - start + 1)
        # 实时更新dict中s[i]的最新位置
        char_dict[s[i]] = i
    return len_max

Input: pwwkew

# i=0时 s[0]=p ->len_max =1 char_dict[p]=0
# i=1时 s[1]=w ->len_max =2 char_dict[w]=1
# i=2时 s[2]=w start=2 ->char_dict[2]=2
# i=3时 s[3]=k ->len_max =2 char_dict[k]=3
# i=4时 s[4]=e ->len_max =3 char_dict[e]=4
# i=5时 s[5]=w start=3 ->char_dict[w]=5
# len_max =3

##

##