前往
大廳
主題

LeetCode - 926. Flip String to Monotone Increasing 解題心得

Not In My Back Yard | 2022-01-14 00:00:05 | 巴幣 0 | 人氣 324

題目連結:


題目意譯:
一個二元字串為單調遞增如果它由若干個(可能沒有)0,接著若干個(同樣可能沒有)1。

你被給定一個字元字串 s。你可以翻轉 s[i] 使其從 0 變 1 或從 1 變 0。

回傳使 s 變為單調遞增最少所需翻轉次數。

限制:
1 ≦ s.length ≦ 10 ^ 5
s[i] 只為 0 或是 1。



範例測資:
範例 1:
輸入: s = "00110"
輸出: 1
解釋: 我們將最後一位翻轉而得到 00111。

範例 2:
輸入: s = "010110"
輸出: 2
解釋: 我們翻轉得到 011111,或另一種可能為 000111。

範例 3:
輸入: s = "00011000"
輸出: 2
解釋: 我們翻轉得到 00000000。


解題思維:
假設 X 為字串開頭到當前字元為止要符合題目要求且以 1 作結(也就是 0……01…1)所需的最少翻轉次數、Y 為字串開頭到當前字元為止要符合題目要求且以 0 作結(也就是 0……0)所需的最少翻轉次數。可以看到空字串,X = Y = 0。

接著掃過 s 的每個字元。當我們在 s[i] 時,可以看到要符合要求的話要嘛來自 0……0 然後接著 s[i]、要嘛就是來自 0……01……1 然後接著 s[i]。

因此當 s[i] = '0' 時, X 之值將更新為 min(X, Y) + 1(「+1」是因為要將現在的 '0' 變為 '1' 好結束於 '1')、 Y 將保持為 Y;當 s[i] = '1' 時, X 之值將更新為 min(X, Y) 、 Y 將變為 Y + 1(「+1」是因為要將現在的 '1' 變為 '0' 好結束於 '0')。其中 min() 代表著取最小值。

掃完 s 所有字元後,min(X, Y) 即為所求。




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

創作回應

更多創作