696. Count Binary Substrings 计数二进制子串
給定一個字符串 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”字符。
字符分組
我們可以將字符串 sss 按照 000 和 111 的連續段分組,存在 counts\rm countscounts 數組中,例如 s=00111011s = 00111011s=00111011,可以得到這樣的 counts\rm countscounts 數組:counts={2,3,1,2}{\rm counts} = \{2, 3, 1, 2\}counts={2,3,1,2}。
這里 counts\rm countscounts 數組中兩個相鄰的數一定代表的是兩種不同的字符。假設 counts\rm countscounts 數組中兩個相鄰的數字為 uuu 或者 vvv,它們對應著 uuu 個 000 和 vvv 個 111,或者 uuu 個 111 和 vvv 個 000。它們能組成的滿足條件的子串數目為 min?{u,v}\min \{ u, v \}min{u,v},即一對相鄰的數字對答案的貢獻。
對于某一個位置 iii,其實我們只關心 i?1i - 1i?1 位置的 counts\rm countscounts 值是多少,所以可以用一個 last\rm lastlast 變量來維護當前位置的前一個位置,這樣可以省去一個 counts\rm countscounts 數組的空間。
Code
def countBinarySubstrings(self, s: str) -> int:ans, cur, last, length = 0, 0, 0, len(s)while cur < length:c, count = s[cur], 0while cur < length and s[cur] == c:cur += 1count += 1ans += min(count, last)last = countreturn ans復雜度分析
- 時間復雜度:O(n)O(n)O(n)。
- 空間復雜度:O(1)O(1)O(1)。
總結
以上是生活随笔為你收集整理的696. Count Binary Substrings 计数二进制子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: marked Options
- 下一篇: 2020\Simulation_1\3.