题目链接
题目描述
给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。
示例1
输入
[2,3,4,5]
返回值
4
示例2
输入
[2,2,3,4,3]
返回值
3
备注:
1≤n≤10 ^5
思路
考虑以一个位置结尾的可以往前延伸到的位置,根据此位置求出无重复子串的长度。
具体操作可以记录一个名为lastpos指针,这个指针记录到当前位置时,可以往前延伸的最前的位置。
考虑如何更新指针,从一个位置到下一个位置时,加入了一个数a:
- 如果a在前面没有出现过,指针不变,并记下这个数出现的位置。
- 如果a出现过,那么指针的位置要大于a上次出现的位置,即lastpos=max(lastpos,last_happen[arr[i]]+1);;
所以定义一个叫last_happen的unordered_map,时刻更新每个数字上次出现的位置即可。
以串23245为例:
一开始last_happen中全为-1,lastpos为0
遇到第一个字符2时,last_happen[2]变为0,ans变为1
遇到第二个字符3时,last_happen[3]变为1,ans变为2
遇到第三个字符2时,更新lastpos为1,last_happen[2]变为2,ans变为2
遇到第四个字符4时,last_happen[4]变为3,ans变为3
遇到第五个字符5时,last_happen[5]变为4,ans变为4
代码如下:
#include<unordered_map>
class Solution {
public:
int maxLength(vector<int>& arr) {
unordered_map<int,int> last_happen;
int ans=0,lastpos=0;
for(auto i:arr)
last_happen[i]=-1;
for(int i=0;i<arr.size();i++){
//如果在前面出现过
if(last_happen[arr[i]]!=-1)
lastpos=max(lastpos,last_happen[arr[i]]+1);
ans=max(ans,i-lastpos+1);
last_happen[arr[i]]=i;
}
return ans;
}
};