📅  最后修改于: 2023-12-03 15:07:26.734000             🧑  作者: Mango
给定一个只有 0 和 1 的字符串,你可以将任意长度为 2 的连续子串从 01 替换为 10,或者从 10 替换为 01。请返回可替换的最大子串长度。
例如,字符串 "010" 可以被替换为 "101",因此最大长度为 1;而字符串 "1010" 可以替换为 "0101",因此最大长度为 2。
注意,原字符串中没有相邻的重复字符。
读完题目后,我们会发现,对于一个字符串而言,只有两种情况可能导致字符串无法进行替换操作:
因此,我们可以采用滑动窗口的思想,在遍历字符串的同时维护一个窗口,用来记录当前可替换的最大子串,并在遍历过程中不断更新该窗口。
每当出现窗口不能进行替换操作的情况时,我们就需要将窗口往前移动,直到窗口中的字符满足替换条件。
def replaceMax(s: str) -> int:
n = len(s)
left, right, count = 0, 1, 0
while right < n:
if s[right] == s[right - 1]:
left = right
else:
if s[left] == s[right]:
left = right - 1
count = max(count, right - left + 1)
right += 1
return count
由于代码只对字符串进行了一次遍历,与字符串长度 n 相关,因此时间复杂度为 O(n)。
代码只使用了常数个额外变量,因此空间复杂度为 O(1)。