C++LeetCode 每日一题 - 计数二进制子串

题目链接:https://leetcode-cn.com/problems/count-binary-substrings/
这里给出一篇小白题解

Description

给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。
重复出现的子串要计算它们出现的次数。

Sample_1

输入: “00110011”
输出: 6
解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。

请注意,一些重复出现的子串要计算它们出现的次数。

另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。

Sample_2

输入: “10101”
输出: 4
解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。

PS

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

Solution

直接暴力,重头到尾遍历一遍字符串,字符是’1’,++len1。字符是’0’,++len0。只要找到一个与前一个字符不同的字符,并且前面已经有两种字符了,那么答案就加上前面两种字符中字符个数较小的个数,ans+=min(len0,len1)。然后将当前字符的个数赋 0 值。因为每次是计算前面字符的,所以最后还要加一次,再写一次ans+=min(len0,len1)。

例子:“001110”
那么遍历到最后一个字符时,len1=3,len0=2,所以ans+=min(len1,len0),即ans+=2。然后len0=0;然后因为这个字符是’0’,再++len0;
最后再ans+=min(len0,len1),所以ans=3。

AC Code
class Solution {
public:
    int countBinarySubstrings(string s) {
        int len[2]={0};
        int Len=s.length();
        char flag=s[0];
        bool v=0;
        int ans=0;
        for(int i=0;i<Len;i++){
            if(s[i]!=flag){
                if(v==0) v=1;
                else{
                ans+=min(len[0],len[1]);
                len[int(s[i])-48]=0;
                }
                flag=s[i];
            } 
            if(s[i]=='1') ++len[1];
            else ++len[0];
        }
        ans+=min(len[0],len[1]);
        return ans;
    }
};

觉得有帮助,点个赞再走吧!嘻嘻!

猜你喜欢

转载自blog.csdn.net/buibuilili/article/details/107904209
今日推荐