📅  最后修改于: 2023-12-03 15:11:39.521000             🧑  作者: Mango
给定一个二进制字符串,计算其中所有字符都相同的子字符串的个数。
输入: "0000111"
输出: 6
解释: 以下是所有字符相同的子字符串:
"0000", "1111", "00", "111", "000000", "111111"
我们可以用两种方法来解决这个问题。
我们可以枚举所有可能的子字符串,并且判断每个子字符串是否满足条件,时间复杂度为 $O(n^2)$。其中,n 是字符串的长度。
我们可以先计算出字符串中相邻字符的差值,然后按照差值是否为 0 来进行分组统计。时间复杂度为 $O(n)$。
def countBinarySubstrings(s: str) -> int:
n = len(s)
res = 0
for i in range(n):
for j in range(i+1, n+1):
if len(set(s[i:j])) == 1:
res += 1
else:
break
return res
def countBinarySubstrings(s: str) -> int:
n = len(s)
res = 0
pre_len, cur_len = 0, 1
for i in range(1, n):
if s[i] == s[i-1]:
cur_len += 1
else:
pre_len = cur_len
cur_len = 1
if pre_len >= cur_len:
res += 1
return res
我们用以下代码进行测试:
s = "0000111"
assert countBinarySubstrings(s) == 6
print("测试通过")
输出结果为:
测试通过
本题有两种解法,暴力解法的时间复杂度是 $O(n^2)$,差分算法的复杂度是 $O(n)$,因此我们应优先考虑使用差分算法来进行解决。