滑动窗口真的懂了呀系列《无重复字符的最长子串》

117 阅读1分钟

滑动窗口:连续字串枚举+hash统计判断边界条件+移动left解除冲突,更新有效过程的max

Problem: leetcode.cn/problems/lo…

思路

结果状态集合,如果继续枚举的值,不会出现有效状态,是单调的,在边界处停止,逆向缩减尝试。

枚举字符+hash统计判断边界条件+继续扩展right当前状态无效,扩大过程更无效。移动left解除冲突,统计有效状态的max

解题方法

一个一个枚举字符,从左到右,对于每一个字符,判断它的有效性,有没有跟之前出现的字符冲突(重复出现,如果有冲突,就移动左边的指针,直到不冲突,并且计算max(right - left +1)

利用hash表,存储下经过的字符,枚举到一个字符的时候,从hash表中O(1)查找下遇到过没有,直到打破非有效状态(冲突)

Code

class Solution {
    public int lengthOfLongestSubstring(String s) {
        char[] arr = s.toCharArray();

        int ans = 0;
        int l = 0;
        int r = 0;
        int n = arr.length;

        HashMap<Character,Integer> hash = new HashMap<>();

        for(;r<n;r++){
            while(hash.get(arr[r]) != null && hash.get(arr[r]) ==1){
                hash.put(arr[l++],0);
            }
            ans = Math.max(ans, r-l+1);
            hash.put(arr[r],1);
        }
        return ans;
    }
}