↓快轉到主要內容
  1. LeetCode/

LeetCode 1461: Check If a String Contains All Binary Codes of Size K

·1 分鐘· ·
LeetCode Medium Hash-Table String Bit-Manipulation Rolling-Hash
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-01-05

  • 提交紀錄:Wrong Answer ×2 → Accepted

解題思路
#

長度 k 的二進位碼有 2^k 種。把 s 裡所有長度 k 的子字串丟進集合(String 模板三),大小等於 2^k 就全部都有。

  • 子字串只有 len(s) - k + 1 個,比 2^k 少就一定不夠,可以先回傳。
  • k <= 20,也可以用滾動的整數代替子字串:code = ((code << 1) | bit) & mask,省掉切片。

我的嘗試
#

  1. 第一版加入的是 s[right - k: right],結尾不包含 right,最後一個視窗永遠收不到。例如 "10"、k = 1:只收到 "1",回傳 False,答案 True。
  2. 第二版改成 s[right - k - 1: right],長度變成 k + 1,更錯。
  3. 改成 s[right - k + 1: right + 1] 就 AC 了。

正確解法
#

class Solution:
    def hasAllCodes(self, s: str, k: int) -> bool:
        need = 1 << k
        if len(s) - k + 1 < need:
            return False
        seen = {s[i:i + k] for i in range(len(s) - k + 1)}
        return len(seen) == need

複雜度
#

時間 O(n · k),空間 O(min(n, 2^k) · k)。用滾動整數可以降到 O(n) 時間。

要特別避免的錯誤
#

  • s[a:b] 長度是 b - a,結尾不包含 b。
  • 子字串數量不夠 2^k 時可以直接回傳 False。

面試口說整理
#

我把所有長度 k 的子字串放進集合,看集合大小是不是 2^k。子字串總數比 2^k 少就直接是 False。也可以用位元滾動維護目前的 k 位數字,避免切片。時間 O(nk)。

相關文章

LeetCode 1016: Binary String With Substrings Representing 1 To N
·2 分鐘
LeetCode Medium Sliding-Window String Bit-Manipulation Hash-Table
LeetCode 1016 解題筆記:s 最多 1000 個字元,長度固定時的子字串數量有限,n 太大一定是 False;從 n 往下檢查會很快失敗,或從每個起點往右最多延伸 30 位收集所有 <= n 的值
LeetCode 187: Repeated DNA Sequences
·1 分鐘
LeetCode Medium Hash-Table String Bit-Manipulation Sliding-Window
LeetCode 187 解題筆記:把每個長度 10 的子字串丟進雜湊表計數,出現超過一次的就是答案
LeetCode 3694: Distinct Points Reachable After Substring Removal
·1 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table String
LeetCode 3694 解題筆記:終點 = 全部的位移 − 被刪掉那段的位移;用長度 k 的視窗維護那段的位移,把每個終點放進 set
LeetCode 2131: Longest Palindrome by Concatenating Two Letter Words
·1 分鐘
LeetCode Medium Greedy Hash-Table String Counting
LeetCode 2131 解題筆記:每個字跟它的反轉配成一對放兩邊;本身是回文的字也能兩兩配對,只有剩下的一個能放正中間
LeetCode 1410: HTML Entity Parser
·1 分鐘
LeetCode Medium Hash-Table String
LeetCode 1410 解題筆記:由左到右在每個位置嘗試比對六個 entity,比對到就整段跳過;不能用連續的 replace
LeetCode 3121: Count the Number of Special Characters II
·1 分鐘
LeetCode Medium Hash-Table String
LeetCode 3121 解題筆記:記錄每個字母小寫最後一次出現和大寫第一次出現的位置,小寫最後一次在大寫第一次之前才算