📅  最后修改于: 2023-12-03 15:11:39.465000             🧑  作者: Mango
给定一个二进制字符串,计算其中仅包含1的长度为K的子数组的数量。
例如,对于二进制字符串"1010111"和K=3,它所包含的长度为3且仅由1组成的子数组有"101"和"111",因此计数结果为2。
本题的思路可以借鉴滑动窗口的思想。
首先,我们创建两个指针,left和right,表示子数组的左右边界。
接着,我们进行如下操作:
将right指针向右移动K位,即形成一个长度为K的子数组。
判断子数组中是否都是1,是则计数器+1。
将left指针向右移动一位,即去掉原来子数组中的最左边的1,同时判断此时新形成的子数组是否都是1,是则计数器+1。
重复执行步骤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
这里列举几个测试样例,以检验代码的正确性:
输入"1010111"和3,期望输出2。
输入"1111111"和4,期望输出4。
输入"11010101"和2,期望输出3。
输入"11001100"和3,期望输出1。