3.无重复字符的最长子串|Python|LeetCode

一、题目

在这里插入图片描述

二、题解

  • start【left】不动,end【i】向后移动
  • 当end【i】遇到重复字符,start【left】应该放在上一个重复字符的位置的后一位,同时记录最长的长度
  • 怎样判断是否遇到重复字符,且怎么知道上一个重复字符的位置?–用哈希字典的键来判断是否重复,用值来记录该字符的下一个不重复的位置。
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        substrr = dict()
        left = 0
        maxlen = 0
        for i, value in enumerate(s):
            index = substrr.get(value,-1) # 看value在字典中吗?如果在,返回下标值;不在,返回-1【这样在下面if判断时候,就不需要重复检查在不在字典中了,因为不在字典中时,-1一定比left(>=0)小,不在的话就更加不用进if里去了】

            if index >= left: # 如果 新加入的值value 在最长子串范围内 [left,i)
                left = substrr.get(value) + 1 # 左边界右移

            substrr[value] = i

            maxlen = max(maxlen , i - left + 1) # i从0开始,计数补加1
        return maxlen

看了下参考题解,这个解法有个名字叫滑动窗口
参考1
参考2

dict.get()感觉有点像KMP中next记录回退的下标

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值