这是之前的最大连续子数组和的变种,代码差不多。只不过是递推公式发生了变化,不再是直接清零就好了,反而是要拿到前面重复数字的后一位开始继续

public int maxLength (int[] arr) {
    // write code here

    if(arr==null || arr.length==0){
        return -1;
    }
    HashMap<Integer,Integer> map=new HashMap<>();
    int dp[]=new int [arr.length];
    for(int i=0;i<arr.length;i++){
        if(i==0){
            map.put(arr[i],i);
            dp[0]=1;
        }else{
            if(map.containsKey(arr[i])){
                int index=(int)map.get(arr[i]);
                map.clear();
                for(int j=index+1;j<=i;j++){
                    map.put(arr[j],j);
                }
            }else{
                map.put(arr[i],i);
            }
            dp[i]=Math.max(dp[i-1],map.size());
        }
    }
    return dp[arr.length-1];
}