牛客题霸--找到字符串的最长无重复字符子串

找到字符串的最长无重复字符子串

https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4?tpId=117&&tqId=35074&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking

找到字符串的最长无重复字符子串

题目链接

Solution

寻找最长的无重复子串。
考虑以一个位置结尾的可以往前延伸到的位置,根据此位置求出无重复子串的长度。
具体操作可以记录一个指针,这个指针记录到当前位置时,可以往前延伸的最前的位置。
考虑如何更新指针,从一个位置到下一个位置时,加入了一个数a:

  • 如果a在前面没有出现过,指针不变,并记下这个数。
  • 如果a出现过,那么指针的位置要大于a上次出现的位置,即now=max(now,last[a]);
    所以定义一个map,时刻更新每个数字上次出现的位置即可。

Code

class Solution {
public:
    int maxLength(vector<int>& arr) {
        map<int,int> last;
        int ans = 0, now = 0;
        for (int i = 0; i < (int)arr.size(); ++i) last[arr[i]] = -1;
        for (int i = 0; i < (int)arr.size(); ++i) {
            if (last[arr[i]] != -1) now = max(now, last[arr[i]] + 1);
            ans = max(ans, i - now + 1);
            last[arr[i]] = i;
        }
        return ans;
    }
};
全部评论
你好,我有个疑问,为什么非要now=max(now,last[arr[i]]+1);而不能now=last[arr[i]]+1。我试了一下,不行
点赞 回复 分享
发布于 2021-05-04 11:21
好兄弟,我懂了。那个now指针可以这么理解:代表最近出现的有重复出现的数字指针的位置
点赞 回复 分享
发布于 2021-03-01 10:43
for(int i=0;i<(int)arr.size();++i){ if(last[arr[i]]!=-1) now=max(now,last[arr[i]]+1) ans=max(ans,i-now+1); last[arr[i]]=i; } 这部分代码理解不上去,求师兄指点!!!
点赞 回复 分享
发布于 2021-03-01 10:27

相关推荐

od现在都成这样了&nbsp;就业市场真是crazy
牛客473059135号:没事,我有个朋友是985本硕学计算机的,被华为卡目标院校了简历挂,不过不是od虽然人家拿到一堆别的offer了就挺搞笑的属于是……
点赞 评论 收藏
分享
在看数据的傻狍子很忙碌:学生思维好重,而心很急,自己想想真的能直接做有难度的东西吗?任何错误都是需要人担责的,你实习生可以跑路,你的同事领导呢
点赞 评论 收藏
分享
评论
9
1
分享

创作者周榜

更多
牛客网
牛客企业服务