1758. 生成交替二进制字符串的最少操作数 - 力扣(LeetCode)
要使字符串 s
变成交替字符串,最少需要多少次操作?我们可以考虑两种交替模式:
- 以
'0'
开头的交替字符串:010101...
- 以
'1'
开头的交替字符串:101010...
计算 s
分别变成这两种模式所需的操作次数,取较小值即为答案。
解法步骤:
- 生成两种交替字符串模式。
- 分别计算
s
变成这两种模式所需的修改次数。 - 取两者的最小值作为结果。
代码实现:
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
时间复杂度:
- 生成
alt1
和alt2
需要O(n)
- 计算
count1
和count2
需要O(n)
- 总体复杂度为
O(n)
优化:
我们可以直接在遍历 s
时计算 count1
和 count2
,减少额外字符串的构造:
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)
的时间复杂度。