給定一個字符串 s
,計算具備相同數量0和1的非空(連續)子字符串的數量,而且這些子字符串中的全部0和全部1都是組合在一塊兒的。bash
重複出現的子串要計算它們出現的次數。數據結構
示例 1 :ui
輸入: "00110011"
輸出: 6
解釋: 有6個子串具備相同數量的連續1和0:「0011」,「01」,「1100」,「10」,「0011」 和 「01」。
請注意,一些重複出現的子串要計算它們出現的次數。
另外,「00110011」不是有效的子串,由於全部的0(和1)沒有組合在一塊兒。複製代碼
示例 2 :spa
輸入: "10101"
輸出: 4
解釋: 有4個子串:「10」,「01」,「10」,「01」,它們具備相同數量的連續1和0。複製代碼
注意:code
s.length
在1到50,000之間。s
只包含「0」或「1」字符。function countBinarySubstrings(str) {
// 創建數據結構,堆棧, 保存數據
let r = [];
// 給定任意的
let match = (str) => {
// 首字母是0或者1的時候使用
let j = str.match(/^(0+|1+)/)[0];
// 而後須要找到互補的1或者0 j[0]^1 表示取反的意思(是數值類型,須要轉成字符串)
// repeat() 快速生成幾倍長度的相同的字符串(長度要保持和j的長度一致)
let o = (j[0] ^ 1).toString().repeat(j.length);
// 子串是兩個拼接起來的,用正則來判斷
let reg = new RegExp(`^(${j}${o})`);
console.log(reg);
if (reg.test(str)) {
return RegExp.$1
// $1表示匹配第一個子表達式
} else {
return ''
}
}
// 經過for循環控制程序運行的流程
for (let i = 0; i < str.length; i++) {
let sub = match(str.slice(i));
if (sub) {
r.push(sub);
}
}
return r;
}
console.log(countBinarySubstrings('11100001111'), '------>countBinarySubstrings');
console.log(countBinarySubstrings('00110011').length, '------>length');複製代碼