📅  最后修改于: 2023-12-03 15:11:39.241000             🧑  作者: Mango
给定一个二进制字符串,计算其中以1开头和结尾的子字符串的数量。
例如,字符串 10101
中,以1开头和结尾的子字符串有 101
和 10101
两个,故答案为 2。
我们可以遍历字符串,记录每个连续为1的子串的长度,然后对每个连续为1的子串长度进行统计,累加即可。
举个例子:
对于字符串 10101
,我们首先得到连续为1的子串长度分别为 1、1 和 1,对应的子串有
1
0
1
0
1
10
01
101
010
1010
其中以1开头和结尾的子串有 101
和 10101
两个。
具体实现可以使用一个 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_len
和 curr_len
分别记录遍历到当前位置时当前连续的1的子串长度和上一个连续的1的子串长度。每当遇到一个不同的字符时,就先将上一个连续的1的子串长度保存到 prev_len
中,并将当前连续的1的子串长度重置为1。如果上一个连续的1的子串长度不小于当前连续的1的子串长度,则将答案 count
加1,否则就不用计数了。最后返回 count
即可。
本文介绍了一种计算二进制字符串中以1开头和结尾的子字符串数量的算法,其时间复杂度为 O(n),空间复杂度为 O(1)。该算法比较简单易懂,适合初学者练手。