题解 | #最长无重复子串#
最长无重复子串
http://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
看了很多解题都需要用到map,我这里提供一个不需要用到map的解法,使用的时间和内存都比使用map的较小
使用双指针,滑动窗口等概念,类似与leetcode的无重复字符的最长字串解法
import java.util.*; public class Solution { /** * * @param arr int整型一维数组 the array * @return int整型 */ public int maxLength(int[] arr) { // write code here // 双指针(左:left,右:right),滑动的窗口(left到right)确保无重复元素 int left = 0; // 左指针 int right = 0; // 右指针 int max = 0; // 保存最大长度 while (right < arr.length) { // 这里使用while循环,也可以使用for遍历 left = findLeft(arr, left, right); // 调整滑动窗口,并重置左指针 max = Math.max(max, right - left + 1); // 更新最大长度 right++; } return max; } /*调整滑动窗口:对比从left到right的新窗口中是否有与arr[right]重复元素, 如果有,则从与arr[right]的值重复的元素的下一个元素作为滑动窗口的左指针left*/ public int findLeft(int[] arr, int left, int right) { for (int i = left; i < right; i++) { // 这里注意不能i <= right,因为当i=right时,arr[i]必然等于arr[right],返回的left指针就不正确了 if (arr[right] == arr[i]) return i + 1; // 如果在对比的范围内出现与arr[right]重复的元素,则从重复元素的下一个开始设置为新的左指针left } return left; // 一圈对比下来都没有重复,则左指针left位置不变 } }