Description
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.
Constraints:
1 <= s.length <= 105s[i]is either'0'or'1'.
Solutions
This function counts consecutive binary substrings where groups of identical digits are followed by equal-length groups of the other digit (e.g., 00 followed by 11 counts as one). It tracks the current digit group size (count), the previous digit group size (prev), and the current digit being processed (cur). As it iterates through the string, whenever the digit changes, it updates prev to the old group size and resets count to 1. After each character, if the current group is at most as large as the previous group (count <= prev), it increments the result, meaning we found a valid balanced pair of digit groups.
/**
* @param {string} s
* @return {number}
*/
var countBinarySubstrings = function(s) {
let count = 0;
let prev = 0;
let cur = '0';
let res = 0;
for (let i = 0; i < s.length; i++) {
if (s[i] === cur) {
count++;
} else {
cur = s[i];
prev = count;
count = 1;
}
if (count <= prev) {
res++;
}
}
return res;
};