力扣刷题记录#字符串#简单#696计数二进制子串

题目描述

给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。
重复出现的子串要计算它们出现的次数。

示例

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

输入: “10101”
输出: 4
解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。

解答

像0011、000111、00001111这样的串,能组成的满足题意的子串有2、3、4个
(0011:0011、01)
(000111:000111、0011、01)
(00001111:00001111、000111、0011、01)
像001、011、0001、00011、11000、11110这样的串,能组成的满足题意的子串是较小连0连1的数量
(001:1个,01)
(011:1个,01)
(00011:2个,0011、01)
所以只需要找到连0(连1)的数量,和跟它相连的上一连1(连0)的数量进行比较即可

class Solution:
    def countBinarySubstrings(self, s: str) -> int:
        length = len(s)
        
        if length<2:
            return 0
        
        count = 0
        
        # 找到第一个连续串
        count_char = 1     
        i = 1
        while i<length:
            if s[i]==s[i-1]:
                count_char += 1
                i += 1
            else:
                break
                
        count_pre = count_char
        
        count_cur = 1
        i += 1
        # 如果整串都为0(或1),则不会进入该循环
        # 整串都为0(或1)时,上一循环结束时,i=length,此时i+=1,则i=length+1
        while i<length+1:
            if i<length:
                if s[i]==s[i-1]:
                    count_cur += 1
                else:
                    count = count + min(count_pre,count_cur)
                    count_pre = count_cur
                    count_cur = 1
                
                i += 1
            else:
                # 最后一组连续串
                count = count + min(count_pre,count_cur)
                i += 1
        
        return count
上一篇:计算机基础知识


下一篇:补码原理——负数为什么要用补码表示