最长无重复子串(Java版)

  • Post author:
  • Post category:java




最长无重复子串

问题描述:

给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。

示例1

输入:[2,3,4,5]

返回值:4

示例2

输入:[2,2,3,4,3]

返回值:3

备注:

1≤n≤10 ^5

直接暴力求解时间复杂度为o^2超时。

所以采用HashMap来求解

思路:将数组中的元素值和下标存入HashMap,在存入之前做一个判断,判断HashMap中是否存在当前元素,如果不存在,put(),如果存在,取出HashMap中元素个数,并清空HashMap,并将待输入元素下标赋值为当前元素的下标。详情请看代码及注释。

在这里插入图片描述

上代码:

import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     *给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。
     */
    public int maxLength (int[] arr) {
        int max=1;//初始化子串长度,最短为1
        int sum=0;//sum用于统计遍历数组时,无子串长度
        Map <Integer,Integer> map = new HashMap<>();//定义map
        for(int index=0,temp;index<arr.length;index++){
            temp = arr[index];
            if(!map.containsKey(temp)){//如果map中不存在temp元素,则将该元素即下标放入map
                map.put(temp,index);
                sum++;//统计个数+1
            }
            else{//如果存在相同元素,则判断谁是最大的,并重新计数
                max = (int)Math.max(sum,max);
                sum=0;
                index = map.get(temp);//将重复元素的下标作为下一次遍历的开始。
                map.clear();清空map容器
            }
        }
        return (int)Math.max(sum,max);
    }
}



版权声明:本文为Galileoh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。