给同学们贴一个我想到的方法吧
来源: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
}
```
00 -
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; }
00 -
快乐动起来呀
2019-03-03
很赞,欢迎把代码贡献到issue,我会给予奖励的哈
012019-03-04
相似问题