696. Count Binary Substrings

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;
    }
}

你可能感兴趣的:(696. Count Binary Substrings)