给出了一个长度为N(最多为10 ^ 5)的字符串,该字符串仅包含0和1。我们必须从原始字符串中删除两个长度恰好为K的子字符串,以使连续的1的数目最大化。>
例如,假设字符串为1100110001并且K = 1。
因此,我们可以删除两个长度为1的子字符串。最好的选择是删除第3位和第4位的0,并将输出作为4(因为新字符串为11110001)
如果我尝试蛮力,肯定会超时。我不知道滑动窗口是否可以工作。谁能给我任何有关如何进行的提示?我显然并不需要完整的答案,只有一些提示对我有用。在此先感谢:)
答案 0 :(得分:1)
这有一个非常简单的动态编程解决方案。
对于每个索引 i ,计算:
对于每个索引,可以很容易地从较早的索引的值中恒定时间计算出这三个值,因此您可以在 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)中找到的最大值是答案。