题目要求:思路用字典存储数组元素的索引,记录一个start,用来表示当前不重复字符串的起点定义mymax,保存当前遍历的最长字符串的长度遍历数组。如果元素i不在字典中,则表示当前没有重复字符。如果i的下标-start大于mymax,即当前非重复字符串的长度大于保存的最大值如果长度很长,则更新mymax的值。如果元素i在字典中,说明之前已经存在过重复元素。赋值字典中mymax[i]的值开始,更新mymax[i]为当前下标。比如字符串abhwb,在遍历到第二个b时,当前的非重复字符串是从上次出现的b的下一位到当前b的,所以先赋值mymax[i]开始。核心代码:mydict={}mymax=0#start从-1开始因为有一个特殊的测试用例"",需要返回的值为1start=-1foriinrange(len(s)):#如果你遍历到元素在字典中,说明已经重复了,如果最后一次出现这个值在start后面,如果mydict中的s[i]和mydict[s[i]]需要更新start>start:#字典中旧值赋值给start,即元素上次出现的位置,更新元素在字典中的当前位置start,mydict[s[i]]=mydict[s[i]],ielse:#如果不在字典中,就把这个值加入到字典中,value是元素的下标mydict[s[i]]=i#i-start是元素的长度当前非重复字符串,如果此长度大于最长记录值mymax,则更新mymax如果i-start>mymax:mymax=i-startreturnmymax完整代码:classSolution(object):deflengthOfLongestSubstring(self,s):""":types:str:rtype:int"""mydict={}mymax=0start=-1foriinrange(len(s)):如果s[i]inmydict和mydict[s[i]]>start:start,mydict[s[i]]=mydict[s[i]],ielse:mydict[s[i]]=iifi-start>mymax:mymax=我-startreturnmymax解释2:用字典保存所有遍历的字符和字符的下标,一个start用来标识当前不重复子串的起点的前一个位置,一个res用来表示结果(substringMaximumlength)从头遍历字符串,如果遇到字典中没有的字符,则将该字符和下标记录到字典中,如果是当前index-start,即非字典的长度-重复子串大于res,则将当前非重复子串的长度赋值给res。如果在字典中遇到一个字符,并且上次出现的字符的下标大于当前start位置,则将这个位置赋给start(即start只向后移动),然后更新对应的下标到字典中的字符,最后返回结果rescorecodeclass解决方案:deflengthOfLongestSubstring(self,s:str)->int:#startsign不重复子串的前一个位置start=-1#Dictionary,用于保存上次出现的字符和下标d={}#不重复子串的最大长度res=0#遍历字符串foriinrange(len(s)):#字典中的字符,startdoes不返回ifs[i]indandd[s[i]]>start:start=d[s[i]]d[s[i]]=i#characterisnotinthedictionaryelse:d[s[i]]=i#也可以写成res=max(res,i-start)ifi-start>res:res=i-startreturnrescompletecode:classSolution:deflengthOfLongestSubstring(self,s:str)->int:start=-1d={}res=0foriinrange(len(s)):ifs[i]indandd[s[i]]>start:start=d[s[i]]d[s[i]]=ielse:d[s[i]]=iifi-start>res:res=i-startreturnres
