【每日一題】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;
}

注:公衆號每天早上更新哦~歡迎大家關注

 

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