// 滑动窗口
public int lengthOfLongestSubstring(String s) {
int length = s.length();
// base case
if (s == null || length == 0) return 0;
int left = 0;
int right = 0;
int res = 0;
// 窗口中的字符
HashMap<Character, Integer> window = new HashMap<>();
// 开始滑动窗口
while (right < length) {
// 扩大窗口
char c = s.charAt(right);
right++;
// 窗口中加入右边界的值,
window.put(c, window.getOrDefault(c, 0) + 1);
// 若窗口中字符出现的次数大于一,说明该字符已经出现过了,所以该缩小窗口了、
while (window.get(c) > 1) {
// 缩小窗口
char d = s.charAt(left);
left++;
// 左边界的字符出现次数减一
window.put(d, window.get(d)-1);
}
// 更新最长子串的长度
res = Math.max(res, right - left);
}
// 返回
return res;
}