如果一个二进制字符串,是以一些 0(可能没有 0)后面跟着一些 1(也可能没有 1)的形式组成的,那么该字符串是 单调递增 的。
给你一个二进制字符串 s,你可以将任何 0 翻转为 1 或者将 1 翻转为 0 。
返回使 s 单调递增的最小翻转次数。
这道题总是在dfs和遍历之间徘徊,最后还是通过遍历得到结果。
dfs也就是dp的思路。
class Solution:
def minFlipsMonoIncr(self, s: str) -> int:
res = float('inf')
all_zero_num = 0
for i in range(len(s)):
if s[i] == '0':
all_zero_num += 1
print('zero_num:', all_zero_num)
l_zero_num = 0
for i in range(len(s) - 1):
if s[i] == '0':
l_zero_num += 1
if s[i] != s[i+1]:
# 以i作为分水岭,i以及之前的1都为0,i之后的0都为1
times = i + 1 - l_zero_num + all_zero_num - l_zero_num
# print(i, times)
res = min(res, times)
# print(i, res)
# 全为0
res = min(all_zero_num, res)
# 全为1
res = min(len(s) - all_zero_num, res)
return res