
亚麻 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 | remove 'a', left=4; remove 'b'... → add 'b' | 5 | [c,b] | 3 |
| 7 | b | remove 'c', left=6; remove '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 lengthOfLongestSubstringKRepeating(s: str, k: int) -> int:
count = defaultdict(int)
left = 0
ans = 0
for right in range(len(s)):
count[s[right]] += 1
# 若当前字符超过 k 次,收缩左端点
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