无重复最长子串python_leetcode 无重复字符的最长子串问题的python解法

原题目

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。

思路

leetcode 不但要求算法正确 而且对算法有速度要求,因此这里不讨论暴力算法

用一个字典保存在遍历时字符串中字符出现的最后位置

用快慢指针标记不重复子串的开始和结束,开始搜索时,慢指针i=0,标记子串开始,快指针j标记子串结束

移动j时,首先检测当前字符是否已经在字典中存有索引,如有检测到已经保存有索引并且索引值大于等于子串的起始位置I 则表明移动j时i和j之间出现了重复字符,此时对比子串长度,并保留大的子串长度。同时,将字串起始位置移动到当前字符上一次出现的位置之后

每次循环最后更新字典中当前字符的索引值5 注意,循环结束后,j移出当前字符串,需要计算这最后一个不重复子串的长度

111.png

如上图所示:当检测到第二个b的出现位置时,第一个子串搜索结束,子串头指针移动到第一个b之后

代码

class Solution:

def lengthOfLongestSubstring(self, s):

"""

:type s: str

:rtype: int

"""

i = 0

maxlen = 1

strslen = len(s)

if strslen == 0:

return 0

j = i + 1

dict1 = {}

dict1[s[i]] = i

index = -1

while j < strslen:

index = dict1.get(s[j],-1) #get this char's last found index, otherwise -1

if index != -1 and index >= i: #this char has been saved in dict and its index larger than i

maxlen = maxlen if maxlen > j -i else j-i #update maxlen

i=index + 1 # move the start pointer i after the char's first occurence

dict1[s[j]] = j #update char's latest index

j += 1 # move j

maxlen = maxlen if maxlen > j -i else j-i #after j move out of string, update maxlen again

return maxlen

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值