滑动窗口
主要注意两个问题:
1、窗口的右边界什么时候可以动,什么时候要停止?
只要j < length就可以一直移动;
当遇到之前重复的字符的时候停止
2、窗口的左边界什么时候可移动,什么时候要停止?
只要i < j && window 中包含右边界的字符,左边界就要一直缩小,即i++;
当重复字符被移出窗口之后停止
public static int longestSubstringWithoutDuplication(String s) {
int n = s.length();
int i = 0, j = 0;
int max = 0;
HashSet<Character> window = new HashSet<>(n);
while (j < n) {
char c = s.charAt(j);
if (window.add(c)) {
j++;
} else {
max = Math.max(max, j - i);
while (i < j && window.contains(c)){
window.remove(s.charAt(i++));
}
}
}
if (i == 0) {
max = n;
}
return max;
}
}