思路:
1)建立一个HashSet 存无重复元素
2)设置窗口左索引 left 和 右索引 right
3)遍历字符串s,left 和 right 初值为0
4)遇到新char元素添加到 set 中
5)同时计算当前的最大窗口res = Math.max(res,r-l-1)
6)右索引逐步递增,直到遇到set集中已存在的元素:
删除set中从左窗口到现在重复元素之间的所有元素,从左索引开始
逐步remove, l++ 直到 重复元素被删除
删除后又将重复元素加入,实现了删除左侧元素
7) 全部遍历之后返回 结果res
代码实现
public int lengthOfLongestSubstring2(String s) {
int res = 0;
Set<Character> set = new HashSet<>();
for(int l = 0, r = 0; r < s.length(); r++) {
char c = s.charAt(r);
while(set.contains(c)) {
set.remove(s.charAt(l++));// "abcdefexyz";
}
set.add(c);
System.out.println(set);
res = Math.max(res, r - l + 1);
}
return res;
}