📅  最后修改于: 2023-12-03 14:55:21.361000             🧑  作者: Mango
给定一个长度为 n 的二进制字符串,你可以翻转其中任意一个位置上的字符。请你最小化这个字符串中 01 和 10 的个数相差的绝对值。
我们可以先统计出给定的字符串中 01 和 10 的个数,然后我们可以假设将一个 1 翻转为 0,或者将一个 0 翻转为 1,都可能会使得 01 和 10 的个数相差的绝对值减少 1。我们可以针对每个位置统计出它变成另一个字符所能带来的减小的绝对值的大小,然后找到这些绝对值中的最小值所对应的位置,将这个位置上的字符翻转即可。
def min_flips(s: str) -> int:
n = len(s)
cnt1, cnt2 = 0, 0
for i in range(n):
if i % 2 == 0:
if s[i] == '1':
cnt1 += 1
else:
cnt2 += 1
else:
if s[i] == '0':
cnt1 += 1
else:
cnt2 += 1
ans = abs(cnt1 - cnt2)
cnt1, cnt2 = 0, 0
for i in range(n):
if i % 2 == 0:
if s[i] == '0':
cnt1 += 1
else:
cnt2 += 1
else:
if s[i] == '1':
cnt1 += 1
else:
cnt2 += 1
ans = min(ans, abs(cnt1 - cnt2))
return ans
本算法遍历一遍字符串进行统计,然后再遍历一遍求解最小翻转次数,所以时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。