给同学们贴一个我想到的方法吧

来源:2-4 计算子串原理讲解

小学生6年级

2019-03-03

/**
 * @param {string} s
 * @return {number}
 */
var countBinarySubstrings = function(s) {
    let totalNum = 0
    let index = 0
    while(index < s.length - 1){
        compute(s[index], index + 1)
    }
    return totalNum
    function compute(num, i) {
        let max = 1
        let tag = 1
        while(s[i] && s[i] === num) {
            i++
            tag++
            max++
        }
        while(tag !== 0 && s[i] && s[i] !== num) {
            i++
            tag--
        }
        if(tag === 0){
            index += max
            totalNum += max
        } else {
            index++
        }
    }
};

老师的代码是通不过 leetcode 上面的最后一个测试用例的(数据量太大了),因为实际上正则的性能并不好。我发现老师比较喜欢用正则,这点值得学习,正则确实方便的多。这里我贴上自己写的另一种能 AC 的,但是时间消耗也很大。
代码挺简单的,主要说明的就是 max,max 就是优化,也就是假如找到了一个子串 000111,那么实际上我下一次是可以直接跳到1的,而不用再遍历之后的两个0。

其实算法题没思路就是做得少,其实这题还是比较容易的,推荐去把 剑指 offer 题目都刷了,刷完一遍之后就会发现好很多了。

写回答

3回答

黄永泰

2019-07-30

```

function repeat(str, number) {

return str.repeat(number)

}


function calc(regStr, str) {

const reg = new RegExp(`${regStr}`, 'g')

const result = str.match(reg)

return result ? result.length : 0

}


export default str => {

let number = 0

let count = Math.floor(str.length / 2)

while (count > 0) {

const l = `${repeat('0', count)}${repeat('1', count)}`

const r = `${repeat('1', count)}${repeat('0', count)}`


number += calc(l, str) + calc(r, str)


count--

}

return number

}


```

0
0

mooooooom

2019-03-06

我也贴一个

export default (s) => {
  // pre 前一个数字连续出现的次数,cur 当前数字连续出现的次数,result 结果子串个数
  let pre = 0, cur = 1, result = 0;
  for (let i = 0, len = s.length - 1; i < len; i++) {
    // 判断当前数字是否与后一个数字相同
    if (s[i] === s[i + 1]) { // 相同,则当前数字出现的次数cur加1
      cur++;
    } else { // 不同,则当前数字事实上变成了前一个数字,当前数字的次数重置为1
      pre = cur;
      cur = 1;
    }
    if (pre >= cur) { // 前一个数字出现的次数 >= 后一个数字出现的次数,则一定包含满足条件的子串
      result++;
    }
  }
  return result;
}


0
0

快乐动起来呀

2019-03-03

很赞,欢迎把代码贡献到issue,我会给予奖励的哈

0
1
小学生6年级
刚刚老师帮忙看了下简历就是很大的帮助了,明天我去贡献。
2019-03-04
共1条回复

JavaScript版 数据结构与算法

填补前端同学的算法短板,掌握面试中最常见的算法与数据结构

2467 学习 · 395 问题

查看课程