【问题标题】:Maximum number of consecutive 1's in a string字符串中连续 1 的最大数量
【发布时间】:2019-11-21 03:35:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您能否更准确地说明您正在最大化什么?
  • @Scott Hunter 我正在最大化字符串中连续 1 的数量。通过删除第三个零(长度为 K(一个 rn)的子串)和第四个零,我可以获得最大编号。连续的 4 个。
  • 所以你是在最大化 1 的最长不间断运行的长度吗? (确切地重申你已经说过的内容并不能帮助澄清任何事情。)
  • 您可以通过前缀和在 O(n) 时间内完成此操作。
  • @scott Hunter 是的。连续的意思是

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


【解决方案1】:

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

对于每个索引i,计算:

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

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

例如,让 BEST(i,r) 为删除 r 个子字符串后紧邻位置 i 之前的最佳长度。如果 i >= K,那么您可以删除以 i 结尾的子字符串并具有 BEST(i,r) = BEST(iK,r-1) 表示 r > 0。如果 string[i-1] = '1' 那么您可以从前一个位置扩展序列并具有 BEST(i,r) = BEST(i-1,r)+1 。为每个 i,r 选择最佳可能性。

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

【讨论】:

  • 第 3 步是否假设删除的子字符串是相邻的?如果不是,如何在 O(1) 时间内计算?
  • 没有。我补充一点
猜你喜欢
  • 1970-01-01
  • 2019-01-28
  • 2013-09-17
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2021-07-22
  • 2019-04-30
  • 2022-11-24
相关资源
最近更新 更多