LeetCode 696. Count Binary Substrings

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.

Answer:

这道题读了半天没读懂,没思路,后来看了一下别人的solution知道要做什么了,大体思路这样子,比如我有一个string `00110011`, 我按照相同的数字group起来,group的值是相同数字出现的个数。那么对于这个字符,我们会得到一个数组[2,2,2,2] (00出现两次,11出现两次,00出现两次,11出现两次)。

然后比如对于`0011` ,那么他会有两个substring符合条件,即就是`0011`和`01` ,这个number2可以由这个得到Math.min(2,2). (2为[2,2,2,2]中第一个元素,2为[2,2,2,2]中第二个元素)。 所以就遍历得到的那个数组,两两比较将结果相加就可以了。底下这个版本的代码已经Accepted。

/**
 * @param {string} s
 * @return {number}
 */
var countBinarySubstrings = function(s) {
    var sum = 0;
    var arr = s.split("");
    var count = 1; var index = 0;
    var countArr = [1];
    for(var i = 1; i< arr.length; i++) {
        if(arr[i-1] == arr[i]) 
            count++;
        else {
           count = 1;
           index++;
        }
        if(!countArr[index]) {
            countArr[index] = 0;
        }    
        countArr[index]++;
    }
    

    for(var j = 0; j < countArr.length - 1; j++) {
      var num = Math.min(countArr[j], countArr[j+1]);
      sum+= num;
      
    }
    
   return sum;
    
    
};

 

转载于:https://www.cnblogs.com/gogolee/p/8127184.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值