其他分享
首页 > 其他分享> > 【字符串】力扣696:计数二进制子串

【字符串】力扣696:计数二进制子串

作者:互联网

给定一个字符串 s,统计并返回具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的。

重复出现(不同位置)的子串也要统计它们出现的次数。

示例:

输入:s = "00110011"
输出:6
解释:6 个子串满足具有相同数量的连续 1 和 0 :"0011"、"01"、"1100"、"10"、"0011" 和 "01" 。
注意,一些重复出现的子串(不同位置)要统计它们出现的次数。
另外,"00110011" 不是有效的子串,因为所有的 0(还有 1 )没有组合在一起。

从左往右遍历数组,记录和当前位置数字相同且连续的长度,以及其之前连续的不同数字的长度。

例如:对于 00110 的最后一位,记录的相同数字长度是 1,因为只有一个连续 0;记录的不同数字长度是 2,因为在 0 之前有两个连续的 1。若不同数字的连续长度大于等于当前数字的连续长度,则说明存在一个且只存在一个以当前数字结尾的满足条件的子字符串。

class Solution:
    def countBinarySubstrings(self, s: str) -> int:
        n = len(s)
        if n == 0 or n == 1:
            return 0
        pre, cur, count = 0, 1, 0 # 注意cur初始化为1,即默认将第1个元素作为current,也便于 i 从第2个元素开始循环
        for i in range(1, n):
            if s[i] == s[i - 1]:
                cur += 1
            else:
                pre = cur
                cur = 1
            if pre >= cur:
                count += 1
        return count

时间复杂度:O(n)
空间复杂度:O(1)

标签:子串,696,数字,力扣,连续,字符串,长度,cur
来源: https://www.cnblogs.com/Jojo-L/p/16435358.html