題目連結:
題目意譯:
你被給定一個二元字串 s。在一秒中,所有 "01" 之實例(譯者注:原文這邊是 "occurrence",而不是 "instances"。不知道麼翻比較好。)將同時被替換成 "10"。
回傳完成這整個過程所需的秒數。
限制:
1 ≦ s.length ≦ 1000
s[i] 只會是 '0' 或是 '1'。
進階:
你可以用 O(n) 的時間複雜度解出這題嗎?
範例測資:
範例 1:
輸入: s = "0110101"
輸出: 4
解釋:
在一秒後,s 變成 "1011010"。
又一秒後,s 變成 "1101100"。
在三秒後,s 變成 "1110100"。
在四秒後,s 變成 "1111000"。
現在沒有 "01" 之實例存在了,因此此過程需要 4 秒才能完成。
所以我們回傳 4。
範例 2:
輸入: s = "11100"
輸出: 0
解釋:
沒有 "01" 之實例存在於 s 之中,因此此過程需要 0 秒才能完成。
所以我們回傳 0。
解題思維:
可以看到題目中的替換操作代表的是:每個 1 都會一直盡量往左靠、每個 0 都會盡量往右靠。而「交換」則是發生於某個 0 和某個 1 相鄰的時時候。
因此可以看到,每一個 1 要往左靠到不能移動為止,其所需的時間只會被兩種條件決定:
1. 前面有多少個 0,就至少要移動多少秒;
2. 前一個 1 就定位所需的時間(對於第一個 1 來說,這時間為 0,因為它沒有前一個) + 1。
所以我們就單純地掃過 s,並用兩個變數 S 和 Z 來分別統計前一個 1 的就定位時間以及現在已經遇到過的 0 之數量(一開始 S = Z = 0)。當遇到 0 時,則將 Z 加 1;當遇到 1 時,則把 S 更新為 max(Z, S + 1)(根據上面兩個條件)。
最後掃完之後的 S 即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。