前往
大廳
主題

LeetCode - 696. Count Binary Substrings 解題心得

Not In My Back Yard | 2020-12-23 00:00:04 | 巴幣 0 | 人氣 337

題目連結:


題目意譯:
給定一字串 s ,請計算出非空(連續)子字串的數量,其滿足有著相同數量的 0 和 1 且這些 0 和 1 各自地、連續地聚在一起。

相同子字串若出現多次,則出現幾次就算幾次。

注:
s.length 介於 1 到 50,000。
s 只會由「0」或「1」兩個字元組成。



範例測資:
範例 1:
輸入: "00110011"
輸出: 6
解釋: 有六個子字串有著相同數量的連續 0 和 1 :"0011" 、 "01" 、 "1100" 、 "10" 、 "0011" 和 "01"。注意有些子字串重複了且出現了幾次就算幾次。而且,"00110011" 不是一個合法的子字串因為 0 跟 1 沒有各自聚在一起。

範例 2:
輸入: "10101"
輸出: 4
解釋: 有四個子字串: "10" 、 "01" 、 "10" 、 "01" 有著相同數量的連續 0 和 1 。


解題思維:
這題跟統計連續字元的長度(如此題)有點類似,就是一直記錄連續的 1 以及連續的 0 之長度,但是因為題目要的子字串裡面的 1 跟 0 要全部聚在一起,所以當碰到一段新的連續 0 區段時就把先前的 0 之計量歸零。同樣地,碰到新的 1 區段時就把 1 的數量歸零。

接著對於每個 0 或是 1 的區段(假設現在是處在連續 0 的區段),每遇到一個 0 ,倘若 1 的數量 ≧ 現在 0 的數量(包含現在看到的 0),就表示我們找到了另一個符合的子字串。例如本來有 5 個 1 、 2 個 0,所以只有 1100 、 10 這兩個子字串符合,但是現在如果又遇到了一個 0 的話,0 的個數就變成了 3 ,所以多了 111000 這個子字串。

所以我們可以只掃過字串一次就求出所求的子字串數量。(藉由統計 0 與 1)




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作