📌  相关文章
📜  给定一个二进制字符串,计算以 1 开头和结尾的子字符串的数量。(1)

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

统计二进制字符串中以1开头和结尾的子字符串数量

简介

给定一个二进制字符串,计算其中以1开头和结尾的子字符串的数量。

例如,字符串 10101 中,以1开头和结尾的子字符串有 10110101 两个,故答案为 2。

解题思路

我们可以遍历字符串,记录每个连续为1的子串的长度,然后对每个连续为1的子串长度进行统计,累加即可。

举个例子:

对于字符串 10101,我们首先得到连续为1的子串长度分别为 1、1 和 1,对应的子串有

1
0
1
0
1
10
01
101
010
1010

其中以1开头和结尾的子串有 10110101 两个。

具体实现可以使用一个 count 变量记录答案,另一个变量 len 记录当前连续的1的子串长度,每当遇到一个0时,就将 len 重置为0,并将当前连续的1的子串长度累加到 count 变量中。

代码实现

以下是该算法的 Python 代码实现:

def count_binary_substrings(s: str) -> int:
    count = 0
    prev_len, curr_len = 0, 1

    for i in range(1, len(s)):
        if s[i] == s[i - 1]:
            curr_len += 1
        else:
            prev_len = curr_len
            curr_len = 1

        if prev_len >= curr_len:
            count += 1

    return count

以上代码中,我们使用两个变量 prev_lencurr_len 分别记录遍历到当前位置时当前连续的1的子串长度和上一个连续的1的子串长度。每当遇到一个不同的字符时,就先将上一个连续的1的子串长度保存到 prev_len 中,并将当前连续的1的子串长度重置为1。如果上一个连续的1的子串长度不小于当前连续的1的子串长度,则将答案 count 加1,否则就不用计数了。最后返回 count 即可。

总结

本文介绍了一种计算二进制字符串中以1开头和结尾的子字符串数量的算法,其时间复杂度为 O(n),空间复杂度为 O(1)。该算法比较简单易懂,适合初学者练手。