题目
题目链接
给定一个长度为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]
不在哈希表中,则加入哈希表,并更新maxLenarr[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