使用双指针以及Map解决最长无重复字串问题

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

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

设置left为做指针,right为右指针,map<int,int>分别存在数组中得值与索引
初始化时候,left = 0;right =1;map加入arr[0],o
在右指针小于数组长度的时候
对右指针的值与做指针判断是否相等,
 如果不相等,那么判断map中是否存在右指针存所指向的值,
    (1)如果不存在,那么就将右指针指向的值和索引加入到map中,如果存在,此时用maxlen与此时map的size()进行比较,得到新maxlen,
    (2)然后左指针右移,其值为右指针所指向的值的第一次出现的索引,然后map清空,然后map加入左指针索引以及指向的值,右指针为左指针加1;
 如果相等,那么将左指针右移一位,右指针也同时右移动

最后返回maxlen与数组长度之间的最大的一个值

  public int maxLength (int[] arr) {
        // write code here
        
        //双指针
          //双指针
        Map<Integer,Integer> map = new HashMap<Integer, Integer>();
        int len = 0,maxlen=0;
        int left = 0,right=1;
        map.put(arr[left],left);
        while(right != arr.length){
            if(arr[right]!=arr[left]){
                if(!map.containsKey(arr[right])){
                    map.put(arr[right],right);
                    right++;
                }else{
                    maxlen = Math.max(map.size(),maxlen);

                    left = map.get(arr[right])+1;
                    map.clear();
                    map.put(arr[left],left);
                    right = left+1;
                }
            }else{
                map.put(arr[right],right);
                left = left+1;
                right = right+1;
            }

        }

        return Math.max(map.size(),maxlen);
    } 

全部评论

相关推荐

豆泥🍀:同26届,加油,我也还没找到查看图片
点赞 评论 收藏
分享
04-03 12:09
東京大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务