BM92 最长无重复子数组(python)

题目

题目链接
给定一个长度为n的数组arr,求arr的最长无重复元素子数组的长度
子数组是连续的,如[1,3,5]是[1,3,5,7,9]的一个子数组,无重复指的是子数组中所有数字都不相同

思路

双指针+哈希

设置i,j两个指针,初始值均为0,arr[i:j+1]为当前正在处理的子串
用字典设置一个哈希表,保存arr[i:j+1]中所有出现过的字符
设置一个变量maxLen在遍历过程中保存最长子串长度
j从1出发,遍历整个数组:

  • arr[j]不在哈希表中,则加入哈希表,并更新maxLen
  • arr[j]已在哈希表中,则让i不断右移,每移动一次弹出哈希表中的arr[i],直到弹出了哈希表中上一个与arr[j]相等的字符,把本次的arr[j]加入哈希表

代码

class Solution:
    def maxLength(self, arr):
        if not arr:
            return 0
        if len(arr) == 1:
            return 1
        i = 0
        hashDict = {arr[0]: 1}
        maxLen = 1
        for j in range(1, len(arr)):
            if arr[j] not in hashDict:
                hashDict.update({arr[j]: 1})
                maxLen = max(maxLen, len(hashDict))
            else:
                while arr[j] in hashDict and i < j:
                    hashDict.pop(arr[i])
                    i += 1
                hashDict.update({arr[j]: 1})
        return maxLen
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值