給定乙個字串 s,計算具有相同數量 0 和 1
的非空(連續)子字串的數量,並且這些子字串中的所有 0 和所有 1 都是組合在一起的
。
重複出現的子串要計算它們出現的次數。
示例1:
輸入: 「00110011」示例2:輸出: 6
解釋: 有6個子串具有相同數量的連續1和0:「0011」,「01」,「1100」,「10」,「0011」 和 「01」。
另外,「00110011」不是有效的子串,因為所有的0(和1)沒有組合在一起。
輸入: 「10101」注意:輸出: 4
解釋: 有4個子串:「10」,「01」,「10」,「01」,它們具有相同數量的連續1和0。
按字元分組
我們可以將字串 s 按照 0 和 1 的連續段分組,存在 counts 陣列中,例如 s = 00111011,可以得到這樣的 counts 陣列:counts = 。
這裡 counts 陣列中兩個相鄰的數一定代表的是兩種不同的字元。假設 counts 陣列中兩個相鄰的數字為 u 或者 v,它們對應著 u 個 0 和 v 個 1,或者 u 個 1 和 v 個 0。它們能組成的滿足條件的子串數目為min
,即一對相鄰的數字對答案的貢獻。
我們只要遍歷所有相鄰的數對,求它們的貢獻總和,即可得到答案。
複雜度分析
class
solution
counts.
add(count);}
for(
int i =
0; i < counts.
size()
-1; i++
)return answer;
}}
優化:
對於某乙個位置 i,其實我們只關心 i −1 位置的 counts 值是多少
,所以可以用乙個 last 變數來維護當前位置的前乙個位置,這樣可以省去乙個 counts 陣列的空間。
**如下:
class
solution
answer = answer + math.
min(last, count)
; last = count;
}return answer;
}}
時間複雜度:o(n)。
空間複雜度:o(1)。
leetcode 696 計數二進位制子串
給定乙個字串s,計算具有相同數量0和1的非空 連續 子字串的數量,並且這些子字串中的所有0和所有1都是組合在一起的。重複出現的子串要計算它們出現的次數。示例 1 輸入 00110011 輸出 6 解釋 有6個子串具有相同數量的連續1和0 0011 01 1100 10 0011 和 01 請注意,一...
LeetCode 696 計數二進位制子串
給定乙個字串s,計算具有相同數量0和1的非空 連續 子字串的數量,並且這些子字串中的所有0和所有1都是組合在一起的。重複出現的子串也要計算它們出現的次數。輸入 00110011 輸出 6 解釋 有6個子串具有相同數量的連續1和0 0011 01 1100 10 0011 和 01 一次遍歷即可,關鍵...
leetcode 696 計數二進位制子串
696.計數二進位制子串 給定乙個字串 s,計算具有相同數量0和1的非空 連續 子字串的數量,並且這些子字串中的所有0和所有1都是組合在一起的。重複出現的子串要計算它們出現的次數。示例 1 輸入 00110011 輸出 6 解釋 有6個子串具有相同數量的連續1和0 0011 01 1100 10 0...