📅  最后修改于: 2023-12-03 15:26:27.444000             🧑  作者: Mango
给定一个仅包含 0 和 1 的字符串 s,你可以从 s 中删除任意数目的 0,来使得 s 中连续出现的 1 的最长子串的长度最大化。
动态规划。
首先需要找到问题的子结构,也就是以 s 中某个位置结尾的最长连续 1 子串的长度。
设 f[i] 为以 s[i] 结尾的最长连续 1 子串的长度(注意,这个子串必须以 s[i] 结尾),那么 f[i] 可以通过下面两种情况转移得到:
然后,问题就转变为了如何计算 count_0 的问题,可以通过一个变量 tmp 来完成计算。
设 g[i] 为最小化需要删除的 0 数以最大化以 s[i] 结尾的最长连续 1 子串的长度,那么 g[i] 可以通过下面两种情况转移得到:
具体来说,当 s[i] 是 0 时,只需要将 tmp 置为 0 即可,因为 i 位置之前的连续 0 的数量需要从头开始计数;当 s[i] 是 1 时,需要将 tmp 加上 i 位置之前的连续 0 的数量,即 tmp += count_0。
因为最优解是以 s 中某个位置结尾的最长连续 1 子串,因此 g[i] 的最大值即为所求。
最终代码如下(Python):
class Solution:
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
n = len(nums)
f = [0] * n
g = [0] * n
res = 0
for i in range(n):
if nums[i] == 0:
f[i] = 0
else:
f[i] = f[i-1] + 1
if nums[i] == 1:
if i == 0 or nums[i-1] == 0:
tmp = 0
g[i] = f[i] + tmp
tmp += 1
res = max(res, g[i])
return res
时间复杂度:O(n)
空间复杂度:O(n)