1、题目:696. 计数二进制子串 题解 - 力扣(LeetCode) (leetcode-cn.com)
2、实现
(1)思路
以'00011’为例,符合题意的是'0011’和‘01’两种,其实有多少种符合题意的答案是根据有两个连续的1来决定的。
那么我们可以遍历字符串s,将s中连续的0和1的数量进行计数,再遍历这个数组,将数组中相邻两位中最小的数量累加即可。
s = "00110011"先生成数组[2,2,2,2]
遍历这个数组,依次比较
第一次比较,结果为2
第二次比较,结果为2
第三次比较,结果位2
无法进行第四次比较,数组越界了...
最后将三次比较的结果累加,就是2+2+2=6
(2)代码实现(其实性能不怎么样,但是思路好理解)
/**
* @param {string} s
* @return {number}
*/
var countBinarySubstrings = function(s) {
// 当字符串长度为0或者1时,返回0
if(s.length < 2) {
return 0;
}
// 对字符串中连续的0/1进行计数
let count = 0, temp = s[0];
let nums = [];
for(let i=0; i<s.length; i++) {
if(temp === s[i]) {
count++;
} else {
nums.push(count);
temp = s[i];
count = 1;
}
}
nums.push(count);
let res = 0;
// 遍历上一次维护计数的数组
for(let i=0; i<nums.length-1; i++) {
res += Math.min(nums[i], nums[i+1]);
}
return res;
};
3、参考:【Leetcode】Python版每日一题(20200810):696. 计数二进制子串(字符串)_哔哩哔哩_bilibili