leetcode每日一题【Day2】——3. 无重复字符的最长子串

  • 类型:可变长度的滚动窗口(while不合法直到合法)
  • 题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
  • 参考题解:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/yi-ge-mo-ban-miao-sha-10dao-zhong-deng-n-sb0x/
  • 思路:可变窗口:(1)遇到不合法窗口时要用while更新直到窗口合法(2)每一次right循环更新都要更新目标
  • 经验:(1)子集可以用集合来记录,set.add(a),set.remove(a) (2)left通过数字初始化和更新,right通过循环初始化和更新(3)集合索引和列表索引的区别:时间复杂度一致,集合的话多了个记录,列表用其自身做记录即可。(4)dict.get(key, default=None) #default – 如果指定键的值不存在时,返回该默认值。
#集合索引
        if not s:return 0
        left = 0
        lookup = set() #用集合来记录子集
        max_len = cur_len = 0
        for i in range(len(s)): #left通过数字初始化和更新,right通过循环初始化和更新
            while s[i] in lookup:#循环直到right不在lookup中
                lookup.remove(s[left])
                left += 1
                cur_len -= 1
            cur_len += 1  #每一次移动right都要更新目标
            max_len = max(cur_len,max_len)
            lookup.add(s[i])
        return max_len

#列表索引
        ##初始化
        max_length=length=0
        i=0
        for j in range(len(s)):
            ##窗口不合法,则移动左指针
            while s[j] in s[i:j]:  #一直查找直到找到重复元素
                i+=1
                length-=1
            length+=1
            max_length=max(max_length,length)
        return max_length
#哈希表索引

明日计划:209. 长度最小的子数组

同解不同题:1695. 删除子数组的最大得分
题目:给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。返回 只删除一个 子数组可获得的 最大得分 。

def maximumUniqueSubarray(self, nums: List[int]) -> int:
    left=0
    sum=0
    max_sum=-math.inf
    window=set()
    for right in range(len(nums)):
        sum+=nums[right] #可以放在while前或者while后
        while nums[right] in window:
            window.remove(nums[left])
            sum-=nums[left]
            left+=1
        window.add(nums[right])   #放在后面while之后是为了避免right=0的bug
        max_sum=max(max_sum,sum)
    return max_sum
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值