leetcode_1461 检查一个字符串是否包含所有长度为 K 的二进制子串

109 阅读1分钟

要求

给你一个二进制字符串 s 和一个整数 k 。

如果所有长度为 k 的二进制字符串都是 s 的子串,请返回 true ,否则请返回 false 。

示例 1:

输入:s = "00110110", k = 2
输出:true
解释:长度为 2 的二进制串包括 "00""01""10""11"。它们分别是 s 中下标为 0132 开始的长度为 2 的子串。

示例 2:

输入:s = "00110", k = 2
输出:true

示例 3:

输入:s = "0110", k = 1
输出:true
解释:长度为 1 的二进制串包括 "0""1",显然它们都是 s 的子串。

示例 4:

输入:s = "0110", k = 2
输出:false
解释:长度为 2 的二进制串 "00" 没有出现在 s 中。

示例 5:

输入:s = "0000000001011100", k = 4
输出:false

提示:

  • 1 <= s.length <= 5 * 105
  • s[i] 不是'0' 就是 '1'
  • 1 <= k <= 20

核心代码

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

image.png

解题思路:所有长度为 k 的二进制字符串等价于 range(0, 2 **k) 上的所有数字,所以只要把所有长度为 k 的二进制字符串对应的十进制数字找出来,再看是否覆盖所有需求数字即可。时间复杂度:O(NK)空间复杂度:O(NK)