python
arr = [format(i, f'0{k}b') for i in range(2**k)]
先看最外层。
for i in range(2**k)
这一步在干嘛?
2**k 表示 2 的 k 次方,也就是所有长度为 k 的二进制数的总数。
例如 k = 3:
2^3 = 8
range(8) 会生成:
0,1,2,3,4,5,6,7
也就是所有 3 位二进制数对应的十进制整数。
接着看核心:format(i, f'0{k}b')
这是格式化函数。
b 表示:把整数转成二进制。
0{k} 表示:总宽度为 k,不够的左边补 0。
假设 k = 3:
format(1, '03b') -> '001'
format(2, '03b') -> '010'
format(7, '03b') -> '111'
那 f'0{k}b' 是什么?
这是 f-string 动态拼接。
如果 k = 3:
f'0{k}b' -> '03b'
所以整句话意思是:
把 i 转成长度为 k 的二进制字符串,不够就补 0。
举个完整例子:
k = 3
arr = [format(i, f'0{k}b') for i in range(2**k)]
结果是:
'000', '001', '010', '011', '100', '101', '110', '111'
转化为二进制还有一种写法:bin(i)[2:],但是不会对长度自动补零
(csp认证曾经考察过这部分)

python
class Solution:
def hasAllCodes(self, s: str, k: int) -> bool:
seen = set()
for i in range(len(s)-k+1):
seen.add(s[i:i+k])
if len(seen)==2**k:
return True
else:
return False