LeetCode:3. 无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 :

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

 

这个题目我们首先就要想到滑动窗口。


class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s==null || s.length()==0){
            return 0;
        }

        Set<Character> set = new HashSet<>();
        int right=0,res=0;
        
        //for循环,i作为滑动窗口的左指针
        for(int i=0;i<s.length();i++){
            //只要没有重复的字符,并且右指针没有超出长度,则右指针往前滑动,并且将字符加入集合
            while (right<s.length() && !set.contains(s.charAt(right))){
                set.add(s.charAt(right));
                right++;
            }
            //有重复字符时则计算一次长度。
            res = Math.max(res,right-i);
            //有重复字符时左指针往前滑动,并将对应位置的字符从集合中剔除
            if(right<s.length() && set.contains(s.charAt(right))){
                set.remove(s.charAt(i));
            }
        }

        return res;
    }
}

时间复杂度:O(n),左右指针各遍历一次。

空间复杂度:O(n),最大为n个不同字符。

LeetCode:3. 无重复字符的最长子串

上一篇:OCP 063中文考试题库(cuug内部资料)第10题


下一篇:Sanic二十六:Sanic + tortoise-orm 之查询(QuerySet )