📅  最后修改于: 2023-12-03 15:27:34.646000             🧑  作者: Mango
给定一个二进制字符串,计算该字符串中有多少个子字符串可被 2 整除。
输入: "1011"
输出: 3
解释: 可被2整除的子串包括 "10"、"01" 和 "10"。
在二进制中,当一个数能被 2 整除时,其二进制表示的最后一位一定是 0。
我们可以枚举所有子串,并将其转为十进制进行判断。
对于每个子串,当且仅当其最后一位为 0 时,才可以被 2 整除。因此,我们只需要判断其最后一位是 0 的个数即可。
具体实现可以使用滑动窗口的方法,将计算结果进行累加。
def countBinarySubstrings(s: str) -> int:
n = len(s)
counts = []
ptr = 0
while ptr < n:
count = 0
c = s[ptr]
while ptr < n and s[ptr] == c:
ptr += 1
count += 1
counts.append(count)
ans = 0
for i in range(1, len(counts)):
ans += min(counts[i], counts[i - 1])
return ans
因此,总时间复杂度为 O(n^2)。