📅  最后修改于: 2023-12-03 15:40:15.896000             🧑  作者: Mango
给定一个01字符串S和数字K,你需要将S中的一些位置翻转,使得S中的0子串的长度不超过K,并且所需的翻转次数最小。一个0子串定义为全是0的连续子串,翻转操作指将一个0改为1或将一个1改为0。
def min_flips(s: str, k: int) -> int:
n = len(s)
l, r = 0, k - 1
flips = [0] * n
cnt = s[:k].count('0')
for i in range(k):
if s[i] == '1':
flips[k - 1] += 1
for i in range(k, n):
if cnt > k:
cnt -= 1 if s[l] == '0' else 0
l += 1
if s[i] == '1':
cnt += 1
flips[i] = flips[i - 1] + 1
else:
flips[i] = flips[i - 1]
if cnt > k:
flips[i] += 1
cnt -= 1
l += 1
return min(flips[i] for i in range(n - k, n))
该算法只遍历了一遍输入数组,所以时间复杂度为O(n)。
该算法只使用了一个大小为n的数组来存储翻转次数,所以空间复杂度为O(n)。
本题思路比较清晰,代码实现也比较简单。由于没有用到任何高级数据结构和算法,所以对于初学者来说是一个很好的练手题。