Skip to content

Commit f9fc331

Browse files
NoyeArkcursoragent
andcommitted
feat: 20260223 check in
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent b6624eb commit f9fc331

1 file changed

Lines changed: 71 additions & 0 deletions

File tree

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# [1461. 检查一个字符串是否包含所有长度为 K 的二进制子串](https://leetcode.cn/problems/check-if-a-string-contains-all-binary-codes-of-size-k/description/)
2+
3+
> **日期**:2026-02-23
4+
> **所用时间**:7min
5+
> **知识点**:滑动窗口、哈希集合
6+
7+
## 1. 题目描述
8+
9+
给你一个**二进制字符串** `s` 和一个整数 `k`。若 s 中包含**所有**长度为 `k` 的二进制串(即 `2^k` 种不同的 0/1 串各至少出现一次作为子串),返回 `true`,否则返回 `false`
10+
11+
**示例 1:**
12+
13+
```
14+
输入:s = "00110110", k = 2
15+
输出:true
16+
解释:长度为 2 的二进制串有 "00","01","10","11",均出现在 s 中。
17+
```
18+
19+
**示例 2:**
20+
21+
```
22+
输入:s = "0110", k = 1
23+
输出:true
24+
解释:长度为 1 的 "0" 和 "1" 都是 s 的子串。
25+
```
26+
27+
**示例 3:**
28+
29+
```
30+
输入:s = "0110", k = 2
31+
输出:false
32+
解释:长度为 2 的 "00" 未在 s 中出现。
33+
```
34+
35+
**提示:**
36+
37+
- `1 <= s.length <= 5 * 10^5`
38+
- `s[i]``'0'``'1'`
39+
- `1 <= k <= 20`
40+
41+
## 2. 滑动窗口 + 哈希集合
42+
43+
用长度为 `k` 的滑动窗口遍历 `s`,把所有出现过的长度为 `k` 的子串加入集合;若集合大小等于 `2^k`,说明所有长度为 k 的二进制串都出现过,返回 `true`,否则 `false`
44+
45+
复杂度分析:
46+
47+
- **时间复杂度**:$O((n - k) \cdot k)$,n 为 s 长度(截取子串与入集合),或 $O(n)$ 若用滚动哈希。
48+
- **空间复杂度**:$O((n - k) \cdot k)$,为集合中最多 `2^k` 个子串。
49+
50+
**Python3**
51+
52+
```python
53+
class Solution:
54+
def hasAllCodes(self, s: str, k: int) -> bool:
55+
st = {s[i:i+k] for i in range(len(s) - k + 1)}
56+
57+
for i in range(2**k):
58+
sub_s = str(bin(i))[2:]
59+
if ('0' * (k - len(sub_s)) + sub_s) not in st:
60+
return False
61+
return True
62+
```
63+
64+
**Python3(优化:只比集合大小)**
65+
66+
```python
67+
class Solution:
68+
def hasAllCodes(self, s: str, k: int) -> bool:
69+
st = {s[i:i+k] for i in range(len(s) - k + 1)}
70+
return len(st) == 2**k
71+
```

0 commit comments

Comments
 (0)