iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0
自我挑戰組

用java解Leetcode系列 第 3

用java解Leetcode Day3

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250917/20169501K7EjRFZ9Bq.pnghttps://ithelp.ithome.com.tw/upload/images/20250917/20169501HKktSox1ev.png
3. Longest Substring Without Repeating Characters

這題是經典的雙指針(或稱滑動窗口)問題,目標是在一個字串中,找出最長的「不重複子元」的子字串,然後回傳它的長度。

要解開這題,要先了解以下名詞:

1.子字串(substring)是指在原字串中連續的一段小字串,例如在poiuytrewq裡,poiuy是子字串,但poiy卻不是,因為u被跳掉了。

  1. 不重複字元(without Duplicate Characters)是指這個字串中的每一個字元都必須是獨一無二的。

我寫的程式的功能,就是要從頭到尾掃描這個字串,找出所有「不重複」條件的子字串,然後記錄下它們之中最長的那個。

我的解題思路是使用滑動窗口(Sliding Window),可以把滑動窗口想像成一個可伸縮的方框,在字串上從左向右移動。首先先定義一個窗口,用兩個指針,一個是左指針,一個是右指針。這個窗口就是從s[left]到s[right]的部分。再來要讓窗口擴大,要使right指針從字串的開頭向右移動,不斷擴大窗口。每當right指針遇到一個新的字元,就把它加進窗口。有擴大就有縮小,如果在字串中碰到重複的字元,就要縮小窗口,
至於如何縮小,可以使用一個叫哈希集合(Hash Set)的方法來記錄窗口內的字元。
如果s[right]這個字元已經在窗口裡了(也就是在哈希集合裡),這就意味著有重複,這時候,就必須縮小窗口,讓left指針向右移動,直到重複的那個字元被移除為止,在移動left的過程中,也要記得把被移除的字元從哈希集合裡刪掉。最後要記錄答案,每次right指針移動後,都要計算當前窗口的長度(right - left + 1),然後更新最大長度紀錄。


上一篇
用java解Leetcode Day2
下一篇
用java解Leetcode Day4
系列文
用java解Leetcode4
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言