来源:力扣(LeetCode)
描述:
如果一个二进制字符串,是以一些 0(可能没有 0)后面跟着一些 1(也可能没有 1)的形式组成的,那么该字符串是 单调递增 的。
给你一个二进制字符串 s,你可以将任何 0 翻转为 1 或者将 1 翻转为 0 。
返回使 s 单调递增的最小翻转次数。
示例 1:
输入:s = "00110"
输出:1
解释:翻转最后一位得到 00111.
示例 2:
输入:s = "010110"
输出:2
解释:翻转得到 011111,或者是 000111。
示例 3:
输入:s = "00011000"
输出:2
解释:翻转得到 00000000。
提示:
- 1 <= s.length <= 105
- s[i] 为 ‘0’ 或 ‘1’
方法:动态规划
代码:
class Solution {
public:
int minFlipsMonoIncr(string &s) {
int dp0 = 0, dp1 = 0;
for (char c: s) {
int dp0New = dp0, dp1New = min(dp0, dp1);
if (c == '1') {
dp0New++;
} else {
dp1New++;
}
dp0 = dp0New;
dp1 = dp1New;
}
return min(dp0, dp1);
}
};
执行用时:16 ms, 在所有 C++ 提交中击败了96.07%的用户
内存消耗:10.8 MB, 在所有 C++ 提交中击败了73.81%的用户
复杂度分析
时间复杂度: O(n),其中 n 是字符串 s 的长度。需要遍历字符串一次,对于每个字符计算最小翻转次数的时间都是 O(1)。
空间复杂度: O(1)。使用空间优化的方法,空间复杂度是 O(1)。
author:LeetCode-Solution