zoukankan      html  css  js  c++  java
  • 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;
        
        
    };
  • 相关阅读:
    WM_PAINT消息详解,使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息(WIN7里有变化,“调整视觉效果”,将“启用桌面组合”去掉)
    delphi 大文件的读写 使用 MapviewOffile
    Delphi的子类化控件消息, 消息子类化
    wParam与lParam的区别
    为什么使用DLL
    大数据分包算法
    JSON如何序列图片
    AngularJs学习
    设计模式解读
    js模块化编程总结
  • 原文地址:https://www.cnblogs.com/gogolee/p/8127184.html
Copyright © 2011-2022 走看看