【刷题笔记】696. 计数二进制子串

110 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

一、题目描述:

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

给定一个字符串 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'

二、思路分析:

利用题中两个特点:1.子串中0和1的个数必须相等 2.子串中每部分必须连续同一个数,统计子串个数。 将连续相同的字符归为一个部分,与相邻不同的部分进行组合子串。结果是个数小的那部分的数量刚好等于组合结果数。 因此,有了下面的题解。

三、AC 代码:

class Solution {
    public int countBinarySubstrings(String s) {
        int prev = 0;
        int curr = 0;
        int res = 0;
        for(int i = 0; i < s.length(); i++){
            if(i == 0 || s.charAt(i) == s.charAt(i - 1)){
                curr++;
            }else{
                res += Math.min(prev,curr);
                prev = curr;
                curr = 1;
            }
        }
        res += Math.min(prev,curr);
        return res;
    }
}

范文参考:

696: 计数二进制子串:按照题目要求计算相邻两个数字的min值,得到取值 - 计数二进制子串 - 力扣(LeetCode)

先计算处每个连续相同段的数目,然后累加每2个连续值的最小值 - 计数二进制子串 - 力扣(LeetCode)