最长不重复子串python_Leetcode3. 无重复字符的最长子串 Python实现

题目要求:

思路

用一个字典来存数组元素的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值