📌  相关文章
📜  给定二进制字符串的所有字符相同的子字符串的计数(1)

📅  最后修改于: 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)$,因此我们应优先考虑使用差分算法来进行解决。