题目描述
给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。
解:
这道题主要是对非重复子数组的利用,也可以认为是DP变化。我们存下 i 位置的最大值,同时把遍历过的非重复子数组存入HashSet,下次就可以直接从最大值位置接着查询而不用从头(i位置)遍历。遍历点 i 可以作为终点,也可以作为起点,这里选用起点方式。
import java.util.*;
public class Solution {
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxLength (int[] arr) {
HashSet<Integer> hs=new HashSet<Integer>();
int max=0,index=0; //index用于指示第一个未入Set的元素位置
//从i位置开始寻找不重复元素集的最大位置
for(int i=0;i<arr.length;i++){
if(index<=i){
index=i+1;
hs.add(arr[i]);
}
for(;index<arr.length;index++){
if(hs.contains(arr[index])){
if((index-i)>max){
max=index-i;
}
break;
}
hs.add(arr[index]);
}
if(index==arr.length){
if((index-i)>max){
max=index-i;
}
//能到达这个位置,要么i=length-1,要么子数组到达length-1,可直接返回了
return max;
}
hs.remove(arr[i]);
}
return max;
}
}