3. Longest Substring Without Repeating Characters
這題是經典的雙指針(或稱滑動窗口)問題,目標是在一個字串中,找出最長的「不重複子元」的子字串,然後回傳它的長度。
要解開這題,要先了解以下名詞:
1.子字串(substring)是指在原字串中連續的一段小字串,例如在poiuytrewq裡,poiuy是子字串,但poiy卻不是,因為u被跳掉了。
我寫的程式的功能,就是要從頭到尾掃描這個字串,找出所有「不重複」條件的子字串,然後記錄下它們之中最長的那個。
我的解題思路是使用滑動窗口(Sliding Window),可以把滑動窗口想像成一個可伸縮的方框,在字串上從左向右移動。首先先定義一個窗口,用兩個指針,一個是左指針,一個是右指針。這個窗口就是從s[left]到s[right]的部分。再來要讓窗口擴大,要使right指針從字串的開頭向右移動,不斷擴大窗口。每當right指針遇到一個新的字元,就把它加進窗口。有擴大就有縮小,如果在字串中碰到重複的字元,就要縮小窗口,
至於如何縮小,可以使用一個叫哈希集合(Hash Set)的方法來記錄窗口內的字元。
如果s[right]這個字元已經在窗口裡了(也就是在哈希集合裡),這就意味著有重複,這時候,就必須縮小窗口,讓left指針向右移動,直到重複的那個字元被移除為止,在移動left的過程中,也要記得把被移除的字元從哈希集合裡刪掉。最後要記錄答案,每次right指針移動後,都要計算當前窗口的長度(right - left + 1),然後更新最大長度紀錄。