【每日一道算法题】给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。

608 阅读1分钟

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

题解1:可以用两个指针实现
    1.i,j两个指针指向起始元素,j指针依次后移,把扫描过的元素放入map中,
    j指针一直后移直到遇到重复元素,顺便记录一个最大值max,
    2.如果遇到重复元素,则将i指针指向该元素,之后的比较max(i,j-i+1

解法一:双指针法

import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        if(arr.length()==0) return 0;
        int max=0;
        HashMap<Integer,Integer> map = new HashMap();
        for(int i=0,j=0;j<arr.length;j++){
            //如果有重复元素,改变i指针
            if(map.containKey(arr[j])){
                i=Math.max(i,map.get(arr[j])+1);
            }
            map.put(arr[j],j);
            max=Math.max(max,j-i+1);
        }
        return max;
    }
}

题解2:可以通过队列辅助
    把元素不停的放进队列中,如果重复则移除队首元素,最终队列的长度即为所求。

解法二:队列辅助求解

import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        int max=0;
        Queue<Integer> queue = new LinkList<>();
        for(int c:arr){
            while(queue.contains(c)){
                //如果有重复,出队
                queue.poll();
            }
            //添加到队尾
            queue.add(c);
            max=Math.max(max,queue.size);
        }
        return max;
    }
}