Easy
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 <= 105
s[i]
is either '0'
or '1'
.class Solution {
fun countBinarySubstrings(s: String): Int {
var start = 0
var ans = 0
val arr = s.toCharArray()
for (i in 1 until arr.size) {
if (arr[i] != arr[i - 1]) {
ans++
start = i - 1
} else if (start > 0 && arr[--start] != arr[i]) {
// if start isn't 0, we may still have a valid substring
ans++
} else {
// if not, then reset start to 0
start = 0
}
}
return ans
}
}