使用双指针以及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);
    } 

全部评论

相关推荐

难怪不开摄像头,全是简单的性格题,比大疆友善多了
NULL10086:今早上发的测评,我这还没做呢,官网上已经显示挂了
投递大疆等公司7个岗位
点赞 评论 收藏
分享
07-15 12:24
重庆大学 运营
坏消息:和好工作擦肩而过
给点吧求求了:怎么可能因为差几秒,估计就是简历更好看婉拒了
点赞 评论 收藏
分享
06-15 20:57
已编辑
门头沟学院 Java
CARLJOSEPH...:年轻人有傲气很正常,但是建议工作前洗净傲气。 说实在的,什么奖学金什么奖项的都很一般。尊重你的老师,在有时间的时候去上课,真遇到走不开的事,请态度端正地向你的老师说明情况,请求请假。我相信任何一个有师德的老师都会允许的(我的老师就是这样)。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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