0
点赞
收藏
分享

微信扫一扫

每日算法系列【LeetCode 926】将字符串翻转到单调递增


题目描述

如果一个由 '0' 和 '1' 组成的字符串,是以一些 '0'(可能没有 '0')后面跟着一些 '1'(也可能没有 '1')的形式组成的,那么该字符串是单调递增的。

我们给出一个由字符 '0' 和 '1' 组成的字符串 S,我们可以将任何 '0' 翻转为 '1' 或者将 '1' 翻转为 '0'。

返回使 S 单调递增的最小翻转次数。

示例1


输入:
"00110"
输出:
1
解释:
我们翻转最后一位得到 00111.


示例2


输入:
"010110"
输出:
2
解释:
我们翻转得到 011111,或者是 000111。


示例3


输入:
"00011000"
输出:
2
解释:
我们翻转得到 00000000。


提示

  • 1 <= S.length <= 20000
  • S 中只包含字符 '0' 和 '1'

题解

每日算法系列【LeetCode 926】将字符串翻转到单调递增_python

代码

c++


class Solution {
public:
int minFlipsMonoIncr(string S) {
int n = S.size();
int dp[n+1];
dp[n] = 0;
for (int i = n-1; i >= 0; --i) {
dp[i] = dp[i+1] + (S[i] == '1');
}
int res = dp[0];
for (int i = 0; i < n; ++i) {
res = min(res, dp[0]-dp[i]+n-i-dp[i]);
}
return res;
}
};


python


class Solution:
def minFlipsMonoIncr(self, S: str) -> int:
n = len(S)
dp = [0] * (n+1)
for i in range(n-1, -1, -1):
dp[i] = dp[i+1] + (1 if S[i]=='1' else 0)
res = dp[0]
for i in range(n):
res = min(res, dp[0]-dp[i]+n-i-dp[i])
return res


举报

相关推荐

0 条评论