LC 926. 将字符串翻转到单调递增 (opens new window) (opens new window)
中等
# 问题描述
如果一个二进制字符串,是以一些 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 <= 105
s[i]
为'0'
或'1'
# 动态规划
比较容易想到动态规划的解法,假设
- 为字符串 翻转为以 结尾的 单调递增 字符串所需的最小翻转次数
- 为字符串 翻转为以 结尾的 单调递增 字符串所需的最小翻转次数
如果是以 结尾,由于字符串需要递增,当 为 时,无需操作 ;当 为 时,需要将 翻转为 ,操作步数为 ,递推公式如下:
如果是以 结尾,由于字符串需要递增,当 为 时,需要执行一次翻转,因为翻转后 为 , 是 或 都满足递增条件,那么最小操作次数为 ;当 为 时,无需操作,那么最小操作次数为 ,递推公式如下::
最终答案为 ,由于 只与 相关,可以使用滚动数组优化
- 时间复杂度:
- 空间复杂度:,未进行空间优化复杂度为
上次更新: 2023/01/31 19:48:05
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!