📅  最后修改于: 2023-12-03 15:37:08.740000             🧑  作者: Mango
给定一个二进制字符串,你需要从中找出可以删除的“010”子序列,使得最终剩余的字符串中不再包含“010”子序列,最终返回可以删除的“010”子序列的最大计数。
输入: "0101010"
输出: 2
解释: 可以删除 "010" 直到字符串变成 "1",所以可以删除的“010”子序列的最大计数为 2。
一个较为直观的思路是使用正则表达式匹配所有的“010”子序列,计数即可,但是这样会超时。
考虑使用双指针法,在字符串中维持两个指针l
和r
,表示当前搜索区间的左右端点。
对于每一个r
,往前遍历找到最靠左的符合条件的l
,记为p
,使得区间[p, r]
中不存在“010”子序列。
当找不到符合条件的p
时,把l
设置为当前r
的前一个位置,表示从l + 1
到r
这一段是无法处理的“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)$。