Medium
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.
Note:
s.length
will be between 1 and 50,000.
s
will only consist of "0" or "1" characters.
这个题看的答案,记录一个preLen和一个curtLen来表示前面和当前重复元素的个数。比如0011,你访问到第一个1的时候,curtLen = 1表示现在又一个1,preLen = 2表示前面有两个0;然后遍历 string s, 如果连续的两个相同,就curtLen++; 如果不相同,就要reset curtLen = 1, preLen = curtLen. 直到遇见preLen >= curtLen, res++. 比如0011你遇到第一个1的时候,preLen = 2, curtLen = 1, 这时候01满足条件,res++; 当你遍历到第二个1的时候,preLen = 2, curtLen = 2, 这时候0011满足条件,res++.
class Solution {
public int countBinarySubstrings(String s) {
if (s == null || s.length() == 0){
return 0;
}
int preLen = 0;
int curtLen = 1;
int count = 0;
for (int i = 0; i < s.length() - 1; i++){
if (s.charAt(i) == s.charAt(i + 1)){
curtLen++;
} else {
preLen = curtLen;
curtLen = 1;
}
if (preLen >= curtLen){
count++;
}
}
return count;
}
}