---
# System prepended metadata

title: 696. Count Binary Substrings
tags: [string, Leetcode, python, c++, easy]

---

###### tags: `Leetcode` `easy` `string` `python` `c++`

# 696. Count Binary Substrings

## 題目:
Given a binary string ```s```, return the number of non-empty substrings that have the same number of ```0```'s and ```1```'s, and all the ```0```'s and all the ```1```'s in these substrings are grouped consecutively.

Substrings that occur multiple times are counted the number of times they occur.

**Example 1:**
```
Input: s = "00110011"
Output: 6
Explanation: There are 6 substrings that have equal number of consecutive 1's and 0's: "0011", "01", "1100", "10", "0011", and "01".
Notice that some of these substrings repeat and are counted the number of times they occur.
Also, "00110011" is not a valid substring because all the 0's (and 1's) are not grouped together.
```
**Example 2:**
```
Input: s = "10101"
Output: 4
Explanation: There are 4 substrings: "10", "01", "10", "01" that have equal number of consecutive 1's and 0's.
```

## 解題想法:
* 題目為，找滿足連續子字符串中**01連續個數相等**的子字符串的個數
``` 
ex: s="0010001100"
stack=[2,1,3,2,2]
子字串為01交錯而成，長度為min(a,b)
所以子字串個數: 
min(2,1)=1
min(1,3)=1
min(3,2)=2
min(2,2)=2
res=1+1+2+2=6

why: min(3,2)=2個子字串
即為: (01,0011)兩個
```

## Python:
``` python=
class Solution(object):
    def countBinarySubstrings(self, s):
        """
        :type s: str
        :rtype: int
        """
        curLen=1
        stack=[]
        res=0
        for i in range(1,len(s)):
            if s[i]==s[i-1]:
                curLen+=1
            else:
                stack.append(curLen)
                curLen=1
        stack.append(curLen)
        for i in range(1,len(stack)):
            res+=min(stack[i],stack[i-1])
        return res

if __name__=='__main__':
    result=Solution()
    ans=result.countBinarySubstrings(s="0010001100")
    print(ans)
```

## C++:
``` cpp=
#include<bits/stdc++.h>
using namespace std;

class Solution {
public:
    int countBinarySubstrings(string s) {
        int curLen=1;
        vector<int> subLen;
        int res=0;
        for (int i=1; i<s.size(); i++){
            if (s[i]==s[i-1])
                curLen+=1;
            else{
                subLen.push_back(curLen);
                curLen=1;
            }
        }
        subLen.push_back(curLen);
        for (int i=1; i<subLen.size(); i++){
            res+=min(subLen[i],subLen[i-1]);
        }
        return res;
    }
};

int main(){
    string s="0010001100";
    Solution res;
    int ans=res.countBinarySubstrings(s);
    cout<<ans<<endl;
    return 0;
}

```