python-leetcode-1758. 生成交替二进制字符串的最少操作数

1758. 生成交替二进制字符串的最少操作数 - 力扣(LeetCode)

要使字符串 s 变成交替字符串,最少需要多少次操作?我们可以考虑两种交替模式:

  1. '0' 开头的交替字符串:010101...
  2. '1' 开头的交替字符串:101010...

计算 s 分别变成这两种模式所需的操作次数,取较小值即为答案。

解法步骤

  1. 生成两种交替字符串模式。
  2. 分别计算 s 变成这两种模式所需的修改次数。
  3. 取两者的最小值作为结果。

代码实现:

def minOperations(s: str) -> int:
    n = len(s)
    alt1, alt2 = "", ""
    
    # 生成两种交替模式
    for i in range(n):
        alt1 += '0' if i % 2 == 0 else '1'
        alt2 += '1' if i % 2 == 0 else '0'
    
    # 计算变成两种模式的修改次数
    count1 = sum(1 for i in range(n) if s[i] != alt1[i])
    count2 = sum(1 for i in range(n) if s[i] != alt2[i])
    
    return min(count1, count2)

# 测试
s = "0100"
print(minOperations(s))  # 输出 1

时间复杂度:

  • 生成 alt1alt2 需要 O(n)
  • 计算 count1count2 需要 O(n)
  • 总体复杂度为 O(n)

优化:

我们可以直接在遍历 s 时计算 count1count2,减少额外字符串的构造:

def minOperations(s: str) -> int:
    count1 = count2 = 0
    
    for i, ch in enumerate(s):
        if ch != ('0' if i % 2 == 0 else '1'):
            count1 += 1
        if ch != ('1' if i % 2 == 0 else '0'):
            count2 += 1
    
    return min(count1, count2)

这种方式减少了额外空间的使用,依旧保持 O(n) 的时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值