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

本文介绍了如何解决LeetCode的一道题目,目标是找到使给定的二进制字符串变为单调递增序列所需的最小翻转次数。通过动态规划的方法,定义dp[i]表示字符串前i个字符的最小翻转次数,分析了四种情况以确定dp[i+1]的值,从而求解问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果一个由 '0' 和 '1' 组成的字符串,是以一些 '0'(可能没有 '0')后面跟着一些 '1'(也可能没有 '1')的形式组成的,那么该字符串是单调递增的。

我们给出一个由字符 '0' 和 '1' 组成的字符串 S,我们可以将任何 '0' 翻转为 '1' 或者将 '1' 翻转为 '0'。

返回使 S 单调递增的最小翻转次数。

动态规划

dp[i]表示前i个字符所需最小翻转次数,则dp[i+1]存在4种情况,取4种情况中的最小值

  • 第i+1个字符为0,不翻转,dp[i+1]=前i个字符中1的个数(不翻转,要求前i个字符必须将1全部翻转为0,翻转为000...0全为0的序列)
  • 第i+1个字符为0,翻转,dp[i+1]=dp[i]+1(前i个字符翻转为递增序列)
  • 第i+1个字符为1,不翻转,dp[i+1]=dp[i](前i个字符为递增序列)
  • 第i+1个字符为1,翻转,dp[i+1]=前i个字符中1的个数+1(前i个字符中1全部翻转为0,翻转为全为0的序列)
    class Solution:
        def minFlipsMonoIncr(self , s ):
            # write code here
            if len(s)==1:
                return 0
            dp = [0 for k in range(len(s))]
            # 当 i=0 时 dp[0]=0
            for i in range(1,len(s)):
                if s[i]=='0':
                    dp[i]=min(s[:i].count('1'),dp[i-1]+1)
                else:
                    dp[i]=min(dp[i-1],s[:i].count('1')+1)
            return dp[len(s)-1]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值