📅  最后修改于: 2023-12-03 15:36:25.876000             🧑  作者: Mango
给定一个二进制字符串,我们可以通过将一个或多个连续的 1 翻转为 0 来使字符串中的所有字符都等于 '0'。
请计算在转换字符的任意次数后,使字符串中的所有字符均为 '0' 的最大长度。
对于这道问题,我们可以使用滑动窗口的思想解决。
我们用 left 和 right 定义一个滑动窗口,该窗口中的连续1的个数不大于 k。
每当我们发现窗口的连续 1 的个数大于 k 时,我们可以将 left 指向下一个位置开始新的窗口。
在每个窗口中,我们可以将右端点 right 不断向右移动,指导不能将 1 翻转为 0 为止。
每次我们改变 right 时,我们需要更新最大值 max_length。
最后返回 max_length 即可。
def longestSubstring(s: str, k: int) -> int:
n = len(s)
left = right = 0
max_length = 0
zero_count = 0
while right < n:
if s[right] == "0":
zero_count += 1
if zero_count > k:
if s[left] == "0":
zero_count -= 1
left += 1
max_length = max(max_length, right - left + 1)
right += 1
return max_length
时间复杂度:O(n),其中 n 是二进制字符串的长度。我们最多遍历二进制字符串两次。
空间复杂度:O(1),因为我们使用了常数个变量。