力扣926. 将字符串翻转到单调递增

234 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

这部分可以写写:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目,我们采用前缀和的方法来做,我们最终要得到的是前面全部为0,后面全是1,一次我们可以枚举每一个形态,然后看哪些情况变化最少。

    我们可以利用前缀和方法先计算前缀和数组,遍历字符串,计算前面的字符有几个0,将这些1变成0.同时计算后面有多少0,将0变成1.计算变换次数,然后取最小值。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    是一次通过的。用Python做这道题是十分方便的!

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

image.png

三、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. 将字符串翻转到单调递增

这道题目方法比较多,我们需要掌握其前缀和和动态规划方法!这道题目比较经典,是可以反复刷的好题!