696. 計數二進制子串

給定一個字符串 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');複製代碼
相關文章
相關標籤/搜索