题目要求:
思路
用一个字典来存数组元素的index
记录一个start,用来表示当前的不重复的字符串的起点
定义mymax,保存当前遍历过的最长的字符串的长度
遍历数组,如果元素i不在字典中,说明当前没有出现重复的字符,如果i的下标-start大于mymax,也就是当前不重复的字符串的长度大于保存的最长的长度,更新mymax的值,如果元素i在字典中,说明前面已经有重复的元素,把字典中mymax[i]的值赋给start,更新mymax[i]为当前的下标。比如字符串abhwb,遍历到第二个b时,当前不重复的字符串是从上一次出现的b的下一位到当前的b,所以要先把mymax[i]的值赋给start。
核心代码:
mydict = {}
mymax = 0
# start从-1开始是因为有一个特殊的测试用例" ",需要返回的值是1
start = -1
for i in range(len(s)):
# 如果遍历到的元素在字典中,说明重复出现了,而且如果这个值上一次出现的位置在start后面,start需要更新
if s[i] in mydict and mydict[s[i]] > start:
#字典中旧的值赋给start,即上一次该元素出现的位置,更新字典中这个元素当前的位置
start , mydict[s[i]] = mydict[s[i]] , i
else:
#如果不在字典中,把这个值加到字典里,value为该元素的下标
mydict[s[i]] = i
# i - start为当前无重复的字符串的长度,如果这个长度比记录的最长的值mymax还大,更新mymax
if i - start > mymax:
mymax = i - start
return mymax
完整代码:
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
mydict = {}
mymax = 0
start = -1
for i in range(len(s)):
if s[i] in mydict and mydict[s[i]] > start:
start , mydict[s[i]] = mydict[s[i]] , i
else:
mydict[s[i]] = i
if i - start > mymax:
mymax = i - start
return mymax