[LeetCode解題攻略] 3. Longest Substring Without Repeating ...

閱讀時間約 5 分鐘

題目描述

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

例如:

  • 輸入:s = "abcabcbb"
    輸出:3(最長的不重複子字串是 "abc",其長度為 3)
  • 輸入:s = "bbbbb"
    輸出:1(最長的不重複子字串是 "b",其長度為 1)
  • 輸入:s = "pwwkew"
    輸出:1(最長的不重複子字串是 "wke",其長度為 3)

解題思路

此題的目標是找出字串中不含重複字母最長子字串的長度,重點在於找到每個子字串,並確保子字串內部沒有重複的字母。這裡我們可以運用滑動窗口來解題。

滑動窗口是一種雙指針技術,適合用來處理連續區間的問題。我們會使用一個滑動窗口遍歷字串,用一個集合儲存目前窗口中的字符,並且保持窗口內的字符唯一性。


解法一:滑動窗口 + 集合

步驟:

  1. leftright 指針來控制窗口,初始時都指向字串開頭。
  2. 用一個集合 char_set 存儲當前窗口內的字符。
  3. right 指向的字符不在 char_set 時,將其加入集合,並更新最大長度。
  4. right 指向的字符在 char_set 中時,從 left 開始移除字符直到窗口內字符唯一。
  5. right 每次迭代右移,直到遍歷完整個字串。

這樣可以確保每次新增字符到窗口時,窗口內的字符都不重複。

程式碼實現:

class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
char_set = set()
left = 0
max_length = 0

for right in range(len(s)):
# 移除重複字符
while s[right] in char_set:
char_set.remove(s[left])
left += 1
# 加入新字符並更新最大長度
char_set.add(s[right])
max_length = max(max_length, right - left + 1)

return max_length
  • 時間複雜度O(n),其中 n 是字串長度。rightleft 指針分別只遍歷一次字串,每次移動都需要花費 O(1) 時間。
  • 空間複雜度O(min(n, m)),其中 m 是字符集大小,用於存儲集合中的字符。

解法二:優化滑動窗口 + 字典記錄

在前面的解法中,我們用集合檢查窗口內的字符是否有重複,但移除字符可能不夠高效。為了更進一步優化,可以用字典來記錄字符最後出現的位置。這樣,我們可以跳過中間多餘的字符,直接將 left 移動到重複字符的下一位置,這樣可以減少不必要的遍歷操作。

程式碼實現:

class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
char_index = {}
max_length = 0
left = 0

for right in range(len(s)):
if s[right] in char_index and char_index[s[right]] >= left:
left = char_index[s[right]] + 1 # 移動左指針
char_index[s[right]] = right # 更新字符位置
max_length = max(max_length, right - left + 1)

return max_length
  • 時間複雜度O(n)。在此解法中,我們每個字符只會被訪問一次,並且移動 left 指針到重複字符的下一個位置只需要 O(1) 的操作。
  • 空間複雜度O(min(n, m)),字典存儲每個字符的最後位置,節省了部分冗餘運算。

小結

這道題透過滑動窗口和雜湊結構的結合,可以有效地找到不重複的最長子字串。滑動窗口在字符檢查和位置跳躍方面能夠極大優化搜尋過程,學會這種技巧後,可以應用在許多字串處理的題目中。


歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
在這篇文章中,我們將深入探討 LeetCode 題目「2. Add Two Numbers」的解法。這道題目考察對鏈結串列 (Linked List) 操作和進位處理的掌握。
在 LeetCode 上,Two Sum 這道題目主要考察如何高效地處理數組和數據查找問題,是面試中常見的問題之一。今天我們將詳細解說這道題目,並提供幾種解題方法。
在這篇文章中,我們將深入探討 LeetCode 題目「2. Add Two Numbers」的解法。這道題目考察對鏈結串列 (Linked List) 操作和進位處理的掌握。
在 LeetCode 上,Two Sum 這道題目主要考察如何高效地處理數組和數據查找問題,是面試中常見的問題之一。今天我們將詳細解說這道題目,並提供幾種解題方法。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
題目敘述 Longest Arithmetic Subsequence of Given Difference 給定一個整數陣列nums,請找出給定公差difference的最長的等差數列的長度是多少?
Thumbnail
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
Thumbnail
題目敘述 Longest Palindromic Substring 給定一個輸入字串s,請找出最長的回文子字串。 答案可能不只一個,回傳任何一個合法的答案皆可。
Thumbnail
給定一個字串s,以s擁有的字元製造迴文字串。要能製造出的迴文字串長度最長是多少,觀察迴文字串不外乎兩種模式對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次,或者 對稱部分 + 對稱部分。使用演算法統計出現次數並推理出盡可能充分利用每個字元的迴文字串製造方法。
Thumbnail
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
題目敘述 Longest Arithmetic Subsequence of Given Difference 給定一個整數陣列nums,請找出給定公差difference的最長的等差數列的長度是多少?
Thumbnail
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
Thumbnail
題目敘述 Longest Palindromic Substring 給定一個輸入字串s,請找出最長的回文子字串。 答案可能不只一個,回傳任何一個合法的答案皆可。
Thumbnail
給定一個字串s,以s擁有的字元製造迴文字串。要能製造出的迴文字串長度最長是多少,觀察迴文字串不外乎兩種模式對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次,或者 對稱部分 + 對稱部分。使用演算法統計出現次數並推理出盡可能充分利用每個字元的迴文字串製造方法。
Thumbnail
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,