class Solution {
public:
int minFlipsMonoIncr(string s) {
}
};
剑指 Offer II 092. 翻转字符
如果一个由 '0'
和 '1'
组成的字符串,是以一些 '0'
(可能没有 '0'
)后面跟着一些 '1'
(也可能没有 '1'
)的形式组成的,那么该字符串是 单调递增 的。
我们给出一个由字符 '0'
和 '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 <= 20000
'0'
和 '1'
注意:本题与主站 926 题相同: https://leetcode.cn/problems/flip-string-to-monotone-increasing/
原站题解
python3 解法, 执行用时: 72 ms, 内存消耗: 15.7 MB, 提交时间: 2022-11-23 11:35:20
class Solution(object): def minFlipsMonoIncr(self, S): P = [0] for x in S: P.append(P[-1] + int(x)) return min(P[j] + len(S)-j-(P[-1]-P[j]) for j in range(len(P)))
golang 解法, 执行用时: 4 ms, 内存消耗: 2.3 MB, 提交时间: 2022-11-23 11:34:19
func minFlipsMonoIncr(s string) int { dp0, dp1 := 0, 0 for _, c := range s { dp0New, dp1New := dp0, min(dp0, dp1) if c == '1' { dp0New++ } else { dp1New++ } dp0, dp1 = dp0New, dp1New } return min(dp0, dp1) } func min(a, b int) int { if a > b { return b } return a }
python3 解法, 执行用时: 60 ms, 内存消耗: 15.1 MB, 提交时间: 2022-11-23 11:33:43
class Solution: def minFlipsMonoIncr(self, s: str) -> int: dp0 = dp1 = 0 for c in s: dp0New, dp1New = dp0, min(dp0, dp1) if c == '1': dp0New += 1 else: dp1New += 1 dp0, dp1 = dp0New, dp1New return min(dp0, dp1)