📌  相关文章
📜  可以从给定的二进制字符串中删除的“010..”子序列的最大计数(1)

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

可以从给定的二进制字符串中删除的“010..”子序列的最大计数
问题描述

给定一个二进制字符串,你需要从中找出可以删除的“010”子序列,使得最终剩余的字符串中不再包含“010”子序列,最终返回可以删除的“010”子序列的最大计数。

例子
输入: "0101010"
输出: 2
解释: 可以删除 "010" 直到字符串变成 "1",所以可以删除的“010”子序列的最大计数为 2。
解题方法

一个较为直观的思路是使用正则表达式匹配所有的“010”子序列,计数即可,但是这样会超时。

考虑使用双指针法,在字符串中维持两个指针lr,表示当前搜索区间的左右端点。

对于每一个r,往前遍历找到最靠左的符合条件的l,记为p,使得区间[p, r]中不存在“010”子序列。

当找不到符合条件的p时,把l设置为当前r的前一个位置,表示从l + 1r这一段是无法处理的“010”子序列,需要删除其中两个字符。

依次遍历每个字符,计数删除的“010”子序列的个数。

代码实现
def max_num_of_delete(s: str) -> int:
    count, l = 0, -1
    for r in range(len(s)):
        if s[r:r + 3] == '010':
            if l == -1 or s[l] == '1':
                l = r
            else:
                count += 1
                l += 1
        elif s[r:r + 2] == '01':
            if l == -1 or s[l:r] == '1' * (r - l):
                l = r - 1
            else:
                count += 1
                l = r - 1
    return count
时间复杂度

由于双指针法只遍历了一次字符串,时间复杂度是$O(n)$。