快轉到主要內容
leetcode 3 - Longest Substring Without Repeating Characters

leetcode 3 - Longest Substring Without Repeating Characters

·
類別 
Leetcode
標籤 
Java Leetcode Medium String Problem Blind75
Eason Chiu
作者
Eason Chiu
一個不做筆記就容易忘記的工程師
目錄

題目
#

leetcode 3 - Longest Substring Without Repeating Characters (題目說明請點連結)

題目簡述
#

給定一個字串 s,請你找出其中不含有重複字元的 最長子串 的長度。

範例
#

Example 1:

Input: s = "abcabcbb"
Output: 3
Explanation: 最長不重複子字串是 "abc",長度為 3。

Example 2:

Input: s = "bbbbb"
Output: 1
Explanation: 最長不重複子字串是 "b",長度為 1。

Example 3:

Input: s = "pwwkew"
Output: 3
Explanation: 最長不重複子字串是 "wke",長度為 3。

解題思路
#

這題要求我們找出一個字串中不含重複字符的最長子字串的長度。我們可以使用滑動窗口的方法來解決這個問題,通過兩個指針來維持一個動態的窗口,並使用一個集合來記錄當前窗口中的字符。

解法
#

Sliding Window

  1. 初始化一個集合 set 用於記錄當前窗口中的字符
  2. 使用兩個指針 leftright 來維持窗口,初始都指向字串的開頭
  3. right 指針小於字串長度時,執行以下步驟:
    • 如果字符不在集合中,將其加入集合,更新最大長度,並移動 right 指針
    • 如果字符已在集合中,從集合中移除 left 指針指向的字符,並移動 left 指針
  4. 返回最大長度

步驟
#

  • 初始化:
    • 創建集合 set,初始化 leftright 指針
  • 維持窗口:
    • right 小於字串長度時,檢查字符是否在集合中
    • 更新最大長度,移動指針
  • 返回結果:
    • 返回最大長度

例子說明
#

s = "abcabcbb"

步驟leftright字符set內容maxLen說明
初始化00-{}0初始化指針和集合
第1輪01a{a}1a 不在集合中,加入集合,更新 maxLen
第2輪02b{a, b}2b 不在集合中,加入集合,更新 maxLen
第3輪03c{a, b, c}3c 不在集合中,加入集合,更新 maxLen
第4輪14a{b, c, a}3a 在集合中,移除 left 指針指向的字符,移動 left
第5輪25b{c, a, b}3b 在集合中,移除 left 指針指向的字符,移動 left
第6輪36c{a, b, c}3c 在集合中,移除 left 指針指向的字符,移動 left
第7輪47b{b, c}3b 在集合中,移除 left 指針指向的字符,移動 left
第8輪58b{c, b}3b 在集合中,移除 left 指針指向的字符,移動 left

完整程式碼
#

java
class Solution {
    public int lengthOfLongestSubstring(String s) {
         Set<Character> set = new HashSet<>();
         int left = 0, right = 0, maxLen = 0;

         // 使用滑動窗口維持不重複子字串
         while(right < s.length()){
            char c = s.charAt(right);
            if(!set.contains(c)){
                set.add(c);
                maxLen = Math.max(maxLen, right - left + 1);
                right++;
            }else{
                set.remove(s.charAt(left));
                left++;
            }
         }
        // 返回最大長度
        return maxLen;
    }
}

時間複雜度
#

  • 時間複雜度O(n),其中 n 是字串的長度,每個字符最多被訪問兩次
  • 空間複雜度O(min(m, n)),其中 m 是字符集的大小,n 是字串的長度

相關文章

leetcode 424 - Longest Repeating Character Replacement
類別 
Leetcode
標籤 
Java Leetcode Medium String Problem Blind75
leetcode 5 - Longest Palindromic Substring
類別 
Leetcode
標籤 
Java Leetcode Medium String Problem Blind75
leetcode 57 - Insert Interval
類別 
Leetcode
標籤 
Java Leetcode Medium Array Problem Blind75