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)