Leetcode 696. 计数二进制子串(技巧)

本文介绍一种高效算法,用于统计给定字符串中具有相同数量连续0和1的子串数目。通过分组和遍历操作,实现快速计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


示例1:

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

【思路】:
本题数据量在10的5次方,所以直接暴力枚举是不行的。

我们可以将字符串 ss 按照 00 和 11 的连续段分组,存在 counts 数组中,例如 s = 00111011,可以得到这样counts={2,3,1,2}。

然后遍历取相邻两位最小的,最后累加即可

我们只要遍历所有相邻的数对,求它们的贡献总和,即可得到答案。

不难得到这样的实现:

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/count-binary-substrings/solution/ji-shu-er-jin-zhi-zi-chuan-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【代码】

/**
 * @param {string} s
 * @return {number}
 */ 

var countBinarySubstrings = function(s) {
    var counts = [];
    let arr = s.split("");
    let prev = arr[0];
    let cnt = 1;
    //生成counts数组
    for(let i = 1;i < arr.length;i++){
        if(arr[i] == prev){
            cnt++;
        }else{
            counts.push(cnt);
            prev = arr[i]
            cnt = 1;
        }
        if(i == arr.length - 1){
            counts.push(cnt);
        }
    }
    //console.log(counts)
    let res = 0;
    for(let i = 0;i < counts.length - 1;i++){
        res += Math.min(counts[i], counts[i+1])
    }
    return res;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值