Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
696. 计数二进制子串 - 力扣(LeetCode) (leetcode-cn.com)
给定一个字符串
s,统计并返回具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是成组连续的。重复出现(不同位置)的子串也要统计它们出现的次数。 示例 1:
输入:s = "00110011"
输出:6
解释:6 个子串满足具有相同数量的连续 1 和 0 :"0011"、"01"、"1100"、"10"、"0011" 和 "01" 。
注意,一些重复出现的子串(不同位置)要统计它们出现的次数。
另外,"00110011" 不是有效的子串,因为所有的 0(还有 1 )没有组合在一起。
示例 2:
输入:s = "10101"
输出:4
解释:有 4 个子串:"10"、"01"、"10"、"01" ,具有相同数量的连续 1 和 0 。
提示:
- 1 <= s.length <= 10^5
- s[i] 为 '0' 或 '1'
二、思路分析:
遍历时,记录相邻的0组和1组的个数,取较小值就是这一对相邻的0和1符合要求的子串个数。 用两个变量来表示前一组和当前组的0/1个数:count_pre,count_current 不断更新这两个值即可
三、AC 代码:
class Solution:
def countBinarySubstrings(self, s: str) -> int:
if not s:
return 0
key=int(s[0])#起始值
res=0
count_pre=0#记录上一个0组或1组的长度
count_current=0#记录当前1组或0组的长度
i=0
while i<len(s):
while i<len(s) and int(s[i])==key:
count_current+=1
i+=1
res+=min(count_pre,count_current)
count_pre=count_current
count_current=0
key=1-key
return res