題目連結:
題目意譯:
一個二元字串為單調遞增如果它由若干個(可能沒有)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) 即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。