📌  相关文章
📜  可以替换的最大字符数?最多 A 0 和 B 1,没有相邻的重复(1)

📅  最后修改于: 2023-12-03 15:07:26.734000             🧑  作者: Mango

可以替换的最大字符数?

给定一个只有 0 和 1 的字符串,你可以将任意长度为 2 的连续子串从 01 替换为 10,或者从 10 替换为 01。请返回可替换的最大子串长度。

例如,字符串 "010" 可以被替换为 "101",因此最大长度为 1;而字符串 "1010" 可以替换为 "0101",因此最大长度为 2。

注意,原字符串中没有相邻的重复字符。

算法思路

读完题目后,我们会发现,对于一个字符串而言,只有两种情况可能导致字符串无法进行替换操作:

  1. 如果字符串中有相邻的重复字符;
  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)。