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

简介: 如果一个由 '0' 和 '1' 组成的字符串,是以一些 '0'(可能没有 '0')后面跟着一些 '1'(也可能没有 '1')的形式组成的,那么该字符串是单调递增的。我们给出一个由字符 '0' 和 '1' 组成的字符串 S,我们可以将任何 '0' 翻转为 '1' 或者将 '1' 翻转为 '0'。返回使 S 单调递增的最小翻转次数。

题目描述


如果一个由 '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'

题解


要想把字符串变成递增的,只有两种可能,一种就是从某一处开始全是 1 ,之前都是 0 或者没有,另一种就是全 0 。那么我们只需要遍历这个 1 开始的位置就行了。

对于位置 i ,我们假设从它开始后面都是 1 ,前面都是 0 ,那么需要修改的的次数就是它后面 0 的数量减去它前面 1 的数量。


image.png

代码


c++

classSolution {
public:   
intminFlipsMonoIncr(stringS) {    
intn=S.size(); 
intdp[n+1];   
dp[n] =0;     
for (inti=n-1; i>=0; --i) {    
dp[i] =dp[i+1] + (S[i] =='1'); 
        }  
intres=dp[0]; 
for (inti=0; i<n; ++i) {    
res=min(res, dp[0]-dp[i]+n-i-dp[i]);   
        }    
returnres;
    }
};

python

classSolution:  
defminFlipsMonoIncr(self, S: str) ->int:   
n=len(S)    
dp= [0] * (n+1)    
foriinrange(n-1, -1, -1): 
dp[i] =dp[i+1] + (1ifS[i]=='1'else0)   
res=dp[0]     
foriinrange(n):   
res=min(res, dp[0]-dp[i]+n-i-dp[i])  
returnres

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~


相关文章
|
1月前
leetcode-738:单调递增的数字
leetcode-738:单调递增的数字
37 0
|
1月前
|
监控
代码随想录Day31 贪心06 T738 单调递增的数字 T968监控二叉树
代码随想录Day31 贪心06 T738 单调递增的数字 T968监控二叉树
28 0
|
11月前
|
Cloud Native
【刷题日记】926. 将字符串翻转到单调递增
本次刷题日记的第 61 篇,力扣题为:926. 将字符串翻转到单调递增,中等
|
7月前
|
算法
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
44 0
|
7月前
|
算法 索引
代码随想录训练营Day2:1.有序数组的平方 2.长度最小的子数组3,螺旋矩阵
代码随想录训练营Day2:1.有序数组的平方 2.长度最小的子数组3,螺旋矩阵
14 0
|
10月前
|
算法 索引
代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结
代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结
|
算法 C++ Python
每日算法系列【LeetCode 926】将字符串翻转到单调递增
每日算法系列【LeetCode 926】将字符串翻转到单调递增
|
Java C语言
LeetCode刷题计划——单调数列
LeetCode刷题计划——单调数列
leetcode 738 单调递增的数字
leetcode 738 单调递增的数字
38 0
leetcode 738 单调递增的数字
leetcode-每日一题1403. 非递增顺序的最小子序列(贪心)
时间复杂度:O(n logn) 其中n时数组长度,对数组进行排序需要O(n logn)的时间,对数组进行遍历需要O(n)的时间
79 0
leetcode-每日一题1403. 非递增顺序的最小子序列(贪心)