← 返回博客列表
Amazon

Amazon VO 面试题:最长无重复子串 + Follow-up 允许 k 次重复(滑动窗口)

2026-03-27

Amazon VO Interview

亚麻 VO 的代码不能直接运行,因此思路表达和 Dry Run 尤为关键。面试官在乎的是你的思维过程,而不只是最终代码。下面按面试实战节奏完整复盘这道题。


题目:最长无重复字符子串

给定一个字符串 s,求其中没有重复字符的子串的最大长度。

示例


开口前先讲思路(亚麻面试关键)

亚麻代码不能 run,直接写代码如果面试官不认可会直接凉凉。务必先口头确认思路再动手。

核心思路:滑动窗口

  1. 维护左右两个指针 leftright,表示当前窗口 [left, right)
  2. 每次向右移动 right,将 s[right] 加入窗口。
  3. 如果 s[right] 已存在于窗口中,持续右移 left,直到窗口内不含该字符。
  4. 更新答案 ans = max(ans, right - left + 1)
  5. 用哈希集合(Set)记录窗口内的字符,O(1) 查询。

为什么滑动窗口有效?


代码

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


复杂度分析


Follow-up:每个字符最多允许出现 k 次

题目变体:将「无重复」改为「每个字符最多出现 k 次」,求满足条件的最长子串。

思路调整

  1. 将 Set 换成 HashMap(字典),记录每个字符在窗口内的出现次数。
  2. 每次移入 s[right],计数 +1。
  3. count[s[right]] > k,持续右移 left,对 s[left] 计数 -1(若为 0 则删除键),直到 count[s[right]] <= k
  4. 更新答案。

代码(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