📌  相关文章
📜  给定二进制字符串中仅包含 1 的 K 个长度子数组的计数(1)

📅  最后修改于: 2023-12-03 15:11:39.465000             🧑  作者: Mango

题目介绍

给定一个二进制字符串,计算其中仅包含1的长度为K的子数组的数量。

例如,对于二进制字符串"1010111"和K=3,它所包含的长度为3且仅由1组成的子数组有"101"和"111",因此计数结果为2。

解题思路

本题的思路可以借鉴滑动窗口的思想。

首先,我们创建两个指针,left和right,表示子数组的左右边界。

接着,我们进行如下操作:

  1. 将right指针向右移动K位,即形成一个长度为K的子数组。

  2. 判断子数组中是否都是1,是则计数器+1。

  3. 将left指针向右移动一位,即去掉原来子数组中的最左边的1,同时判断此时新形成的子数组是否都是1,是则计数器+1。

  4. 重复执行步骤1~3直到right指针达到字符串末尾。

注意:在第1步和第3步中,需要进行特判,以免数组越界。具体实现可以参照代码部分。

代码实现

def count_subarrays(s: str, k: int) -> int:
    count = 0
    left, right = 0, k-1
    while right < len(s):
        # 计算子数组中1的个数
        ones = s[left:right+1].count('1')
        if ones == k:
            count += 1
        right += 1
        if right < len(s) and s[right] == '0':
            left = right + 1
        else:
            # 如果left指向的是0,left需要向右移动,直到指向1
            while s[left] == '0':
                left += 1
    return count

测试样例

这里列举几个测试样例,以检验代码的正确性:

  1. 输入"1010111"和3,期望输出2。

  2. 输入"1111111"和4,期望输出4。

  3. 输入"11010101"和2,期望输出3。

  4. 输入"11001100"和3,期望输出1。