解法一:滑动窗口+哈希表


解题思路

本题主要用的是滑动窗口的思想,那么滑动窗口是什么呢?

滑动窗口一种在数据序列上处理数据的抽象概念与算法技巧,广泛应用于数组、字符串、数据流处理等场景,常用于解决各类区间相关的优化问题

简单来说,就是一个根据条件自由变换的区域,该区域根据条件将会遍历完数组,如:

tips: 按键盘上下键也可以切换哦,如果无法看幻灯片,下面有gif

动图版:

做到这一步基本就完成题目要求了,剩下只需要统计最大子串的长度了,只需要按照以下流程遍历:

  1. 判断哈希表中是否有当前位置的字符串

    1. 有的话就 left++ 也就是收缩左边界,并且删除哈希表中的做左边界字符

    2. 没有就继续

  2. 滑动时,记录 right 也就是目前滑动的右边界(当前遍历位置),将其存入哈希表

  3. 统计当前子串长度和结果哪个大(得出最长子串长度)

实现代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
        char[] ss = s.toCharArray();
        Set<Character> set = new HashSet<>();
        int res = 0;
        for (int left = 0, right = 0; right < s.length(); right++) {
            char ch = ss[right];
            while (set.contains(ch)) {
                set.remove(ss[left]);
                left++;
            }
            set.add(ch);
            res = Math.max(res, right - left + 1);
        }
        return res;
    }
}