696. 计数二进制子串

231 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

一、题目描述:

696. 计数二进制子串 - 力扣(LeetCode) (leetcode-cn.com)

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

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

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

示例 2:

输入:s = "10101"
输出:4
解释:有 4 个子串:"10""01""10""01" ,具有相同数量的连续 10

 

提示:

  • 1 <= s.length <= 10^5
  • s[i] 为 '0' 或 '1'

二、思路分析:

每当遇到前一位与目前位不一致时,计算前一位的子串数目 计算方法:前面有zero个连续0和one个连续1相连,取小值即为子串数目 计算完成后就将0的数目zero设为1,开始下一回合

三、AC 代码:

class Solution {
public:
    int countBinarySubstrings(string s) {
        int n=0,zero=0,one=0;
        if(s[0]=='0') zero++;
        else one++;
        for(int i=1;i<s.size();++i){
            if(s[i]=='0'){
                if(s[i-1]=='1'){//每当遇到前一位与目前位不一致时,计算前一位的子串数目
                    //计算方法:前面有zero个连续0和one个连续1相连,取小值即为子串数目
                    n+=min(zero,one);
                    zero=1;//计算完成后就将0的数目zero设为1,开始下一回合
                }else zero++;
            }else{
                if(s[i-1]=='0'){
                    n+=min(zero,one);
                    one=1;
                }else one++;
            }
        }
        n+=min(zero,one);
        return n;        
    }
};

范文参考:

正则表达式提取01序列降维打击 2行简单逻辑解 - 计数二进制子串 - 力扣(LeetCode)

官方解题按字符分组的Python代码 - 计数二进制子串 - 力扣(LeetCode)