找到字符串的最长无重复字符子串(牛客网)

题目链接

题目描述

给定一个数组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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值