-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path696 Count Binary Substrings.py
69 lines (57 loc) · 1.87 KB
/
696 Count Binary Substrings.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/python3
"""
Give a string s, count the number of non-empty (contiguous) 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: "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: "10101"
Output: 4
Explanation: There are 4 substrings: "10", "01", "10", "01" that have equal
number of consecutive 1's and 0's.
"""
class Solution:
def countBinarySubstrings(self, s: str) -> int:
"""
two-pointers + math
"""
cur = 1 # 0 1 symmetry, no need 0, 1 counter, only need cur and prev counter
prev = 0
ret = 0
for i in range(1, len(s)):
if s[i] == s[i-1]:
cur += 1
else:
prev = cur
cur = 1
if prev >= cur:
ret += 1
return ret
def countBinarySubstrings_error(self, s: str) -> int:
"""
two-pointers + math
"""
counter = {"0": 0, "1": 0}
ret = 0
if not s:
return ret
counter[s[0]] += 1
for i in range(1, len(s)):
if s[i] != s[i-1] and counter[s[i]] != 0:
counter[s[i]] = 0
counter[s[i]] += 1
if min(counter["0"], counter["1"]) > 0:
ret += 1
return ret
if __name__ == "__main__":
assert Solution().countBinarySubstrings("00110011") == 6
assert Solution().countBinarySubstrings("00110") == 3