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 <= 105
s[i]
is either '0'
or '1'
.
Solutions#
Solution 1#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class Solution:
def countBinarySubstrings(self, s: str) -> int:
i, n = 0, len(s)
t = []
while i < n:
cnt = 1
while i + 1 < n and s[i + 1] == s[i]:
cnt += 1
i += 1
t.append(cnt)
i += 1
ans = 0
for i in range(1, len(t)):
ans += min(t[i - 1], t[i])
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| class Solution {
public int countBinarySubstrings(String s) {
int i = 0, n = s.length();
List<Integer> t = new ArrayList<>();
while (i < n) {
int cnt = 1;
while (i + 1 < n && s.charAt(i + 1) == s.charAt(i)) {
++i;
++cnt;
}
t.add(cnt);
++i;
}
int ans = 0;
for (i = 1; i < t.size(); ++i) {
ans += Math.min(t.get(i - 1), t.get(i));
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| class Solution {
public:
int countBinarySubstrings(string s) {
int i = 0, n = s.size();
vector<int> t;
while (i < n) {
int cnt = 1;
while (i + 1 < n && s[i + 1] == s[i]) {
++cnt;
++i;
}
t.push_back(cnt);
++i;
}
int ans = 0;
for (i = 1; i < t.size(); ++i) ans += min(t[i - 1], t[i]);
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| func countBinarySubstrings(s string) int {
i, n := 0, len(s)
var t []int
for i < n {
cnt := 1
for i+1 < n && s[i+1] == s[i] {
i++
cnt++
}
t = append(t, cnt)
i++
}
ans := 0
for i := 1; i < len(t); i++ {
ans += min(t[i-1], t[i])
}
return ans
}
|