给定一个数组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;
}
}