给定一个字符串 s,统计并返回具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的。
重复出现(不同位置)的子串也要统计它们出现的次数。
示例1:
输入:s = "00110011"
输出:6
解释:6 个子串满足具有相同数量的连续 1 和 0 :"0011"、"01"、"1100"、"10"、"0011" 和 "01" 。
注意,一些重复出现的子串(不同位置)要统计它们出现的次数。
另外,"00110011" 不是有效的子串,因为所有的 0(还有 1 )没有组合在一起。
【思路】:
本题数据量在10的5次方,所以直接暴力枚举是不行的。
我们可以将字符串 ss 按照 00 和 11 的连续段分组,存在 counts 数组中,例如 s = 00111011,可以得到这样counts={2,3,1,2}。
然后遍历取相邻两位最小的,最后累加即可
我们只要遍历所有相邻的数对,求它们的贡献总和,即可得到答案。
不难得到这样的实现:
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/count-binary-substrings/solution/ji-shu-er-jin-zhi-zi-chuan-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【代码】
/**
* @param {string} s
* @return {number}
*/
var countBinarySubstrings = function(s) {
var counts = [];
let arr = s.split("");
let prev = arr[0];
let cnt = 1;
//生成counts数组
for(let i = 1;i < arr.length;i++){
if(arr[i] == prev){
cnt++;
}else{
counts.push(cnt);
prev = arr[i]
cnt = 1;
}
if(i == arr.length - 1){
counts.push(cnt);
}
}
//console.log(counts)
let res = 0;
for(let i = 0;i < counts.length - 1;i++){
res += Math.min(counts[i], counts[i+1])
}
return res;
};