题目描述:
696题
给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。
重复出现的子串要计算它们出现的次数。
示例 1 :
输入: “00110011”
输出: 6
解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。
请注意,一些重复出现的子串要计算它们出现的次数。
另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。
示例 2 :
输入: “10101”
输出: 4
解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。
注意:
s.length 在1到50,000之间。
s 只包含“0”或“1”字符。
解答:
ps今天状态不好简单说下思路
看下面规律:
01
0011
1100
111000
这样的才算是匹配成功
即我做判断的子串便是找到有这样条件的,从开头找前面几个0后面就必须紧跟着几个1(即想到了用正则去捕获)
然后去它的父串里面匹配即可。匹配返回一个值push到我们事先准备的数组中(因为最后要的是个数所以这里你随便返回个什么东西到数组中即可)
最后返回数组的length就行了
var countBinarySubstrings = function(s) {
let res = [];
const find = str => {
let a = str.match(/^(0+|1+)/)[0];
let b;
if (a.substr(0, 1) == "0") {
b = "1".repeat(a.length);
} else {
b = "0".repeat(a.length);
}
let c = a + b;
if (str.startsWith(c)) {
return 1;
} else {
return null;
}
}
for (let i = 0; i < s.length - 1; i++) {
let str = s.slice(i);
let a = find(str);
if (a != null) {
res.push(a);
}
}
return res.length;
};