LeetCode 696.计数二进制子串(Count Binary Substrings) C C++

题目链接:https://leetcode-cn.com/problems/count-binary-substrings/description/

题目:

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

 注意:

  • s.length 在1到50,000之间。
  • s 只包含“0”或“1”字符。

  题目要求非空子字符串必须是相同的元素且连续的,所以可以得出 连续的相同元素最小个数即为其与相邻不同的元素所能组成的子串个数。我被我自己说的都蒙圈了,怎么说呢。比如11000,'1';的个数是2,'0'的个数是3,所以这一串所符合条件的子串个数为2,因为需要连续且个数相等,所以1 和 0 之间为对称轴,分别向外扩展。因此我们需要将连续的相同元素“压缩”,即统计出现的个数并记录到栈。

 

C 代码:

int countBinarySubstrings(char* s) 
{
    int total = 0,ct = 0;
    int len = strlen(s);
    int ar[50000] = {1}; 
    for (int i = 0;i < len-1;i++)
    {
        if (s[i] != s[i+1])
        {
            ct++;
            ar[ct] = 1;
        }
        else
            ar[ct]++;       
    }
    for (int j = 0;j < ct;j++)
        total += (ar[j] < ar[j+1] ? ar[j] : ar[j+1]);
    
    return total;
}

C++ :

class Solution {
public:
    int countBinarySubstrings(string s) {
        int* ar = new int[50000];
        int count = 1;
        int i = 0,j;
        for (j = 1;j < s.size();j++)
        {
            if (s[j] == s[j-1])
                count++;
            else {
                ar[i++] = count;
                count = 1;
            }
        }
        ar[i++] = count;
        int sum = 0;
        while (--i)
        {
            sum += min(ar[i],ar[i-1]);
        }
        delete []ar;
        return sum;
    }
};

谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值