题目描述
给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。
示例1
输入
[2,3,4,5]
返回值
4
示例2
输入
[2,2,3,4,3]
返回值
3
方法一:暴力算法
数组中的每个元素都循环一遍。比较每次循环的结果。效率极低。
public class MaxLengthMe {
public static void main(String[] args) {
int[] arr = {1,2,3,1,1,2};
MaxLengthMe maxLengthMe = new MaxLengthMe();
System.out.println(maxLengthMe.maxLength(arr));
}
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxLength (int[] arr) {
int max = 0;
int[] arrTemp = new int[arr.length];
int index = 0;
for (int i = 0; i < arr.length; i++) {
index = 0;
for (int j = i; j <arr.length ; j++) {
if(!isEqual(arrTemp, index, arr[j])){
index++;
}else{
break;
}
}
if(index > max){
max = index;
}
}
return max;
}
private boolean isEqual(int[] arrTemp,int index, int compare){
for (int i = 0; i < index; i++) {
if(arrTemp[i] == compare){
return true;
}
}
arrTemp[index] = compare;
return false;
}
}
方法二: 双指针
public class MaxLengthMe {
public static void main(String[] args) {
int[] arr = {1,2,1,3,4};
MaxLengthMe maxLengthMe = new MaxLengthMe();
System.out.println(maxLengthMe.maxLength(arr));
}
public int maxLength(int[] arr) {
int maxLength = 0;
int length = 0;
int index = 0;
int to = 0;
int from = 0;
//循环,每次增加一个元素,判断该字符在之前的数组中是否已经存在,
//存在,则将from变为存在的元素索引+1,不存在,则to索引自增1,判断下一个元素
while(to<arr.length){
index = isEqual2(arr, from, to);
if(-1 != index){
// 有重复的
length = to-from; // 无重复字符字串的长度
// 1 2 3 4 5 4 6 7 8
from = index+1; // 新的开始, 不用数组arr中每个元素
if(maxLength < length){
maxLength = length;
}
}else{
to ++;
}
}
// 处理最后一个子串
if (to - from > maxLength) {
maxLength = to - from;
}
return maxLength;
}
private int isEqual(int[] arr,int from, int to){
for (int i = from; i < to; i++) {
if(arr[i] == arr[to]){
// 返回相等的位置
return i;
}
}
return -1;
}
}