【每日一题】leetcode3无重复字符的最长子串

题目描述

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

示例

输入: s = "abcabcbb"

输出: 3 

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

题目分析

要求从字符串中找到最长的不含重复字符的子串,那么就存在一个区间[start,end],在这个区间内,每个字符不重复且长度最长。怎么找到这个区间呢?首先设置两个指针start和end,start指向区间开始,end指向区间结束,初始都指向s开始,同时我们需要知道字符是否出现过,此时申请一个set,记录start-end出现的字符,向右移动end指针,若没有出现,则加入该字符入set,继续向右移动,若已经出现,此时需要移动start指针的位置到之前该字符出现位置的下一个位置,继续移动end,这个方法有个官方的名字--滑动窗口。下面图解一下,更直观。

 

解法1

public int lengthOfLongestSubstring(String s) {
    //如果长度<=1直接返回
    if (s.length() <= 1) {
        return s.length();
    }
    //开始指针和结束指针均指向第一个位置
    int start = 0, end = 0;
    Set<Character> set = new HashSet<>();
    int max = 1;
    set.add(s.charAt(start));
    ++ end;
    while (start <= end && end < s.length()) {
        if (set.contains(s.charAt(end))) {
            //如果区间内出现过
            int ans = end - start;
            max = Math.max(max, ans);
            //将之前字符前的全部移除出去
            while(start < end && s.charAt(start) != s.charAt(end)) {
                set.remove(s.charAt(start));
                ++ start;
            }
            ++ start;
            ++ end;
        } else {
            set.add(s.charAt(end));
            ++ end;
        }
    }
    int ans = end - start;
    max = Math.max(max, ans);
    return max;
}

注:公众号每天早上更新哦~欢迎大家关注

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章