题目描述
给定一个字符串 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