leetcode 之每日刷题

题目描述:

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;


};

你可能感兴趣的:(力扣刷题)