【C++】双指针+map

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

http://www.nowcoder.com/questionTerminal/b56799ebfd684fb394bd315e89324fb4

条件:

  1. 设置两个指针/索引,left = 0 right = 1
  2. map<int,int>,记录数组元素的 值-索引: value:index

设定:

  1. leftright之间的元素为连续不重复;
  2. map中存放leftright间元素的 值-索引 对;
  3. 初始left right都在数组首部,从right++进数,从left--出数;
  4. 进数: right++,检查map(含连续不重复子序列中所有元素) 中是否存在arr[right],不存在即不重复,向连续不重复子序列进数,加入mapright继续向前。
  5. 出数: left--,以上检查map是否含arr[right]时,若存在,则需要从left段出数,即从map中吐出arr[left],并left++,直至arr[left]==arr[right],即一直吐到存在的和当前right所指同值元素。
  6. 在每次进数出数的过程中,维护不重复子数组的最大长度maxLength = max{maxLength, map.size()}

整个过程,像蚯蚓一样伸缩爬动至数组末尾,right为头 一直向前吞,left为尾 一直前缩吐数。

/*
    【双指针】
    从右指针进数,从左指针出数

*/
    int maxLength(vector<int>& arr) {
        // write code here
        //invalid input
        if(arr.empty())
            return 0;
        //init
        map<int,int> map;            // value-index
        int left = 0;
        int right = 1;
        map[arr[0]] = 0;
        int maxLength = 0;           //记录最大连续不重复子序列长度

        //假设 left--right 为连续不重复段
        while(left<=right && right<arr.size()){    //[left,right]
            //待加入元素 arr[right]重复,先删除再加入
            if(map.count(arr[right])){
                //从left删除至与arr[right]等值元素
                while(arr[left]!=arr[right]){
                    map.erase(arr[left]);
                    ++left;
                }
                ++left;
            }
            //加入arr[right]
            map[arr[right]] = right;
            maxLength = maxLength<map.size()? map.size():maxLength;
            ++right;
        }
        return maxLength;
    }
全部评论
在leetcode找了个无重复最长子字符串的题目,解法类似,不过既然设置了 map[arr[0]] = 0 那么后面的 maxLength 应该初始化为1
3 回复 分享
发布于 2021-04-02 10:21
请问map不会按照插入顺序摆放,那怎么保证left和rigt是按照原来顺序访问的呢?
1 回复 分享
发布于 2021-04-09 02:02
想问下,我用unordered_set也通过了,为什么您要用map呢?
点赞 回复 分享
发布于 2021-09-10 04:25
学习了,不过好像差一句: if (arr.size() < 2) { return 1; } 另外://从left删除至与arr[right]等值元素 while(arr[left]!=arr[right]){ map.erase(arr[left]); ++left; } ++left; 这部分没看懂,不是删除相等的吗?怎么是不等是时候删除
点赞 回复 分享
发布于 2021-08-12 16:40
出数时,明明是left++
点赞 回复 分享
发布于 2021-03-26 12:51

相关推荐

有担当的灰太狼又在摸鱼:零帧起手查看图片
点赞 评论 收藏
分享
评论
30
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务