【Leetcode】1702-修改后的最大二进制串

文章讨论了如何通过有限次的操作1和操作2优化二进制字符串,使其达到最大值。关键在于先用操作2将所有0向左移动,然后用操作1逐步将非末尾的0替换为1。算法的时间复杂度为O(n),空间复杂度也为O(n)。
摘要由CSDN通过智能技术生成

题目简述:

给你一个二进制字符串 binary ,它仅有 0 或者 1 组成。你可以使用下面的操作任意次对它进行修改:
操作 1 :如果二进制串包含子字符串 “00” ,你可以用 “10” 将其替换。比方说, “00010” -> “10010”
操作 2 :如果二进制串包含子字符串 “10” ,你可以用 “01” 将其替换。比方说, “00010” -> “00001”

请你返回执行上述操作任意次以后能得到的最大二进制字符串。(如果二进制字符串 x 对应的十进制数字大于二进制字符串 y 对应的十进制数字,那么我们称二进制字符串 x 大于二进制字符串 y 。)

思路分析:

根据测试案例找到操作及其结果的规律:
操作1:00—>10 从小变大(将高位的0变成1)。
操作2:10—>01 从大变小。其作用效果是将’0‘向左移动(但并不会减少’0’的数量),与原本位于左边的0相邻形成’00‘ 以便再执行操作1。
因此具体普遍规律的操作及结果是:先执行N次操作2使得第一个‘0’右边的‘0’都通过操作2移动到左边与其它‘0’相邻,形成以第一个‘0’为首的一串’0‘;再执行操作1将除了最后一个’0‘以外的左边连续的’0‘逐渐变为’1‘。(注意,第一个’0‘的位置很关键,是其他’0‘左移靠近的目标)最终得到仅有一个’0‘的最大值字符串。
根据操作结果的规律,我们可以直接得到最大值的结果。

示例代码:

class Solution:
    def maximumBinaryString(self, binary: str) -> str:
        zero_cnt = binary.count("0")  # 统计0的个数
        if zero_cnt <= 1:
            return binary
        else:
            first_zero_ind = binary.index("0")  # 第一个0所在的位置
            last_zero_ind = first_zero_ind + zero_cnt - 1
            return last_zero_ind * "1"  + "0" + (len(binary) - last_zero_ind - 1) * "1"

算法复杂度

时间复杂度 O ( n ) O(n) O(n) n代表binary的长度,时间消耗在于遍历binary字符串统计’0’的个数以及找到第一个’0’的位置(虽然在Python中直接调用了库函数str.count()和str.index(),但时间消耗依旧存在);
空间复杂度 O ( n ) O(n) O(n) n代表binary的长度,空间消耗在于输出变更后的字符串;

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值