
亞麻 VO 的程式碼不能直接執行,因此思路表達和 Dry Run 尤為關鍵。面試官在乎的是你的思維過程,而不只是最終程式碼。下面按面試實戰節奏完整複盤這道題。
題目:最長無重複字符子串
給定一個字符串 s,求其中沒有重複字符的子串的最大長度。
範例:
s = "abcabcbb"→ 答案3(子串"abc")s = "bbbbb"→ 答案1(子串"b")s = "pwwkew"→ 答案3(子串"wke")
開口前先講思路(亞麻面試關鍵)
亞麻程式碼不能 run,直接寫程式碼如果面試官不認可會直接涼涼。務必先口頭確認思路再動手。
核心思路:滑動窗口
- 維護左右兩個指針
left、right,表示當前窗口[left, right]。 - 每次向右移動
right,將s[right]加入窗口。 - 如果
s[right]已存在於窗口中,持續右移left,直到窗口內不含該字符。 - 更新答案
ans = max(ans, right - left + 1)。 - 用哈希集合(Set)記錄窗口內的字符,O(1) 查詢。
為什麼滑動窗口有效?
- 窗口內始終維持無重複狀態。
- 左右指針都單調右移,每個字符最多進出窗口各一次。
- 總時間複雜度 O(n)。
程式碼
def lengthOfLongestSubstring(s: str) -> int:
char_set = set()
left = 0
ans = 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])
ans = max(ans, right - left + 1)
return ans
Dry Run(手動跑樣例,亞麻面試必做)
s = "abcabcbb"
| right | s[right] | char_set 操作 | left | 窗口 | ans |
|---|---|---|---|---|---|
| 0 | a | add 'a' | 0 | [a] | 1 |
| 1 | b | add 'b' | 0 | [a,b] | 2 |
| 2 | c | add 'c' | 0 | [a,b,c] | 3 |
| 3 | a | remove 'a', left=1; add 'a' | 1 | [b,c,a] | 3 |
| 4 | b | remove 'b', left=2; add 'b' | 2 | [c,a,b] | 3 |
| 5 | c | remove 'c', left=3; add 'c' | 3 | [a,b,c] | 3 |
| 6 | b | 收縮至 'b' 消失, left=5; add 'b' | 5 | [c,b] | 3 |
| 7 | b | 收縮至 'b' 消失, left=7; add 'b' | 7 | [b] | 3 |
最終答案:3 ✓
複雜度分析
- 時間:O(n),每個字符最多被
left和right各訪問一次。 - 空間:O(min(m,n)),m 為字符集大小(ASCII 最多 128),n 為字符串長度。
Follow-up:每個字符最多允許出現 k 次
題目變體:將「無重複」改為「每個字符最多出現 k 次」,求滿足條件的最長子串。
思路調整:
- 將 Set 換成 HashMap(字典),記錄每個字符在窗口內的出現次數。
- 每次移入
s[right],計數 +1。 - 若
count[s[right]] > k,持續右移left,對s[left]計數 -1(為 0 則刪除鍵),直到count[s[right]] <= k。 - 更新答案。
程式碼(k 次變體):
from collections import defaultdict
def longestSubstringKRepeats(s: str, k: int) -> int:
count = defaultdict(int)
left = 0
ans = 0
for right in range(len(s)):
count[s[right]] += 1
while count[s[right]] > k:
count[s[left]] -= 1
if count[s[left]] == 0:
del count[s[left]]
left += 1
ans = max(ans, right - left + 1)
return ans
k=1 時退化為原題(每字符最多 1 次 = 無重複)。
複雜度:同樣 O(n) 時間,O(min(m,n)) 空間。
面試實戰節奏總結
| 步驟 | 內容 | 亞麻注意點 |
|---|---|---|
| 1. 理解題意 | 複述題目,確認邊界(空串、全重複) | 別假設,主動問 |
| 2. 講思路 | 口頭說清滑動窗口邏輯 | 先講再寫 |
| 3. 寫程式碼 | 參照思路逐步實現 | 變量命名清晰 |
| 4. Dry Run | 手動跑一個樣例 | 亞麻程式碼不能執行,必須做 |
| 5. 複雜度 | 時間 O(n),空間 O(min(m,n)) | 主動分析,不要等問 |
| 6. Follow-up | k 次變體,改 Set → HashMap | 展示延伸思考 |
需要 VO 輔助?
亞麻、Google、TikTok、微軟、Meta、Uber 等方向 VO 實時輔助持續進行中。
微信:Coding0201
#留學生找工作 #亞麻面試 #VO輔助 #滑動窗口 #算法面試 #北美求職
聯繫方式
Email: [email protected]
Telegram: @OAVOProxy