📌  相关文章
📜  给定二进制字符串可被2整除的子字符串数(1)

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

题目介绍:给定二进制字符串可被2整除的子字符串数

题目描述

给定一个二进制字符串,计算该字符串中有多少个子字符串可被 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) 的时间复杂度。
  • 判断每个子串是否可被 2 整除的时间复杂度为 O(1)。
  • 遍历整个字符串,时间复杂度为 O(n)。

因此,总时间复杂度为 O(n^2)。