• 2.6

    • 四刷还有很多细节没搞懂
      1. left 就是 for 的 i
      2. right 是全局的,只随 while 满足条件时前进
      3. 因为需要 remove 前一个,所以 i>1才要 remove(set 的删除队伍头部元素是指定元素)
  • 1.22

    • 探路者绝不回头,收绳子人慢慢往前走(需判断开头的位置不能收因为下标不合法)
    • 用 set 作窗口
  • 1.11

    • 滑动窗口,就是两个指针,一个指针遍历递增,一个指针扫描判断,记录最大值
    • 第二个指针滑动时,需要以边界与是否包含来作为 while 判断
    • 每次大遍历时移除前一个窗口元素
class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet<>();
        int length = s.length();
        int maxLen = 0;
        int right = 0;
        for(int left=0;left<length;left++){
            if(left!=0){
                set.remove(s.charAt(left-1));
            }
            while(right<length&&!set.contains(s.charAt(right))){
                set.add(s.charAt(right));
                right++;
            }
            maxLen = Math.max(maxLen,right-left);
        }
        return maxLen;
    }
}
  • 用set实现滑动窗口
  • set中应为Character而不是string
  • right和left一开始都在0,从0开始滑动
  • 当过了第一个后再开始移除前一个字符