字符串中最大连续1个数字

时间:2019-07-11 12:05:51

标签: string algorithm optimization brute-force sliding-window

给出了一个长度为N(最多为10 ^ 5)的字符串,该字符串仅包含0和1。我们必须从原始字符串中删除两个长度恰好为K的子字符串,以使连续的1的数目最大化。

例如,假设字符串为1100110001并且K = 1。

因此,我们可以删除两个长度为1的子字符串。最好的选择是删除第3位和第4位的0,并将输出作为4(因为新字符串为11110001)

如果我尝试蛮力,肯定会超时。我不知道滑动窗口是否可以工作。谁能给我任何有关如何进行的提示?我显然并不需要完整的答案,只有一些提示对我有用。在此先感谢:)

1 个答案:

答案 0 :(得分:1)

这有一个非常简单的动态编程解决方案。

对于每个索引 i ,计算:

  1. 如果未删除任何内容,则紧接其前的1s序列的长度;
  2. 如果恰好删除了一个子字符串,则可以紧接其后的最长1序列。和
  3. 如果恰好在其之前删除了两个子字符串,则可能紧接其前的最长1序列。

对于每个索引,可以很容易地从较早的索引的值中恒定时间计算出这三个值,因此您可以在 O(N)时间内一次通过。

例如,将 BEST(i,r)设为删除r个子字符串后紧接位置i之前的最佳长度。如果 i> = K ,则可以删除以 i 结尾的子字符串,并使 BEST(i,r)= BEST(iK,r-1)< / strong>表示 r> 0 。如果 string [i-1] ='1',则可以从前一个位置开始扩展序列,并使 BEST(i,r)= BEST(i-1,r)+1 。为每个 i,r 选择最佳可能性。

在步骤(3)中找到的最大值是答案。