926.Flip String to Monotone Increasing === ###### tags: `Medium`,`String`,`DP` [926. Flip String to Monotone Increasing](https://leetcode.com/problems/flip-string-to-monotone-increasing/) ### 題目描述 A binary string is monotone increasing if it consists of some number of `0`'s (possibly none), followed by some number of `1`'s (also possibly none). You are given a binary string `s`. You can flip `s[i]` changing it from `0` to `1` or from `1` to `0`. Return *the minimum number of flips to make* `s` *monotone increasing.* ### 範例 **Example 1:** ``` Input: s = "00110" Output: 1 Explanation: We flip the last digit to get 00111. ``` **Example 2:** ``` Input: s = "010110" Output: 2 Explanation: We flip to get 011111, or alternatively 000111. ``` **Example 3:** ``` Input: s = "00011000" Output: 2 Explanation: We flip to get 00000000. ``` **Constraints**: * 1 <= `s.length` <= 10^5^ * `s[i]` is either `'0'` or `'1'`. ### 解答 #### Python ```python= class Solution: def minFlipsMonoIncr(self, s: str) -> int: # f0: Answer to 0's monotone string steps # f1: Answer to followed by some number of 1's monotone string steps f0, f1 = 0, 0 for ch in s: if ch == '0': f1 += 1 else: f1 = min(f0, f1) f0 += 1 return min(f0, f1) ``` > [name=Ron Chen][time=Jan 17, 2023] #### C++ ##### 思路: 1. 考慮一個合法的string, +"1"時合法不變, +"0"時結果有二, 一為把前面出現的1全變成0, 二為把當前0變成1 ##### 做法: 1. 遍歷string, 紀錄1的數量, 出現0時更新結果, 看是改0還是1 ```cpp= class Solution { public: int minFlipsMonoIncr(string s) { int cnt_1 = 0, res = 0; for(char c : s) { if(c == '1') cnt_1++; else res = min(res+1, cnt_1); } return res; } }; ``` > [name=XD] [time= Jan 17, 2023] Time: $O(n)$ Extra Space: $O(1)$ ### Reference [回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)