持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
力扣926. 将字符串翻转到单调递增
一、题目描述:
如果一个二进制字符串,是以一些 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 <= 10^5
s[i] 为 '0' 或 '1'
来源:力扣(LeetCode) 链接:leetcode.cn/problems/fl… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
这部分可以写写:
-
这道题考察了什么思想?你的思路是什么?
这道题目,我们采用前缀和的方法来做,我们最终要得到的是前面全部为0,后面全是1,一次我们可以枚举每一个形态,然后看哪些情况变化最少。
我们可以利用前缀和方法先计算前缀和数组,遍历字符串,计算前面的字符有几个0,将这些1变成0.同时计算后面有多少0,将0变成1.计算变换次数,然后取最小值。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
是一次通过的。用Python做这道题是十分方便的!
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
三、AC 代码:
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 xrange(len(P)))
四、总结:
如果你还有更多的思考、分析、总结,通通都加上来吧~
926. 将字符串翻转到单调递增
这道题目方法比较多,我们需要掌握其前缀和和动态规划方法!这道题目比较经典,是可以反复刷的好题!