题目
滑动窗口
public class Main {
public static void main(String[] args) {
Main main = new Main();
main.lengthOfLongestSubstring("abca");
}
public int lengthOfLongestSubstring(String s) {
// s由英文字符, 数字, 符号, 空格组成, 用一个256大小的数组来记录滑动窗口内该字符是否出现过
boolean [] visited = new boolean[256];
int left = 0;
int right = 0;
int max = 0;
while (right < s.length()) {
if (visited[s.charAt(right)]) {
// 缩小窗口
visited[s.charAt(left)] = Boolean.FALSE;
left ++;
} else {
// 扩大窗口
visited[s.charAt(right)] = Boolean.TRUE;
right ++;
}
max = Math.max(right - left, max);
}
return max;
}
}
基本思路
-
题目要求是无重复子串, 因此用布尔类型的数组来记录某个字符是否存在过, 根据题目要求, 一个256大小的数组就足够用了, 该数组表示在当前窗口内哪些元素出现过
-
用滑动窗口来截取字符串, 如果窗口内新添加的元素出现过, 那么右指针不变, 左指针加1, 缩小窗口, 如果新添加的元素未出现过, 右指针+1, 左指针不同, 记录所有时刻窗口的最大宽度, 即是题目答案