Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 连续1'的最大数量;它在一个字符串中_String_Algorithm_Optimization_Brute Force_Sliding Window - Fatal编程技术网

String 连续1'的最大数量;它在一个字符串中

String 连续1'的最大数量;它在一个字符串中,string,algorithm,optimization,brute-force,sliding-window,String,Algorithm,Optimization,Brute Force,Sliding Window,给出了一个长度为N(最多可达10^5)的字符串,该字符串仅由0和1组成。我们必须从原始字符串中删除长度正好为K的两个子字符串,以最大化连续1的数量 例如,假设字符串为110001,K=1 所以我们可以删除两个长度为1的子字符串。这里最好的选择是删除第3位和第4位的0,并将输出作为4(因为新字符串将是11110001) 如果我尝试暴力,它肯定会超时。我不知道滑动窗是否能用。有人能给我一些关于如何进行的提示吗?显然,我并不要求得到完整的答案,只是一些提示对我有用。提前感谢:)这是一个非常简单的动态编

给出了一个长度为N(最多可达10^5)的字符串,该字符串仅由0和1组成。我们必须从原始字符串中删除长度正好为K的两个子字符串,以最大化连续1的数量

例如,假设字符串为110001,K=1

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


如果我尝试暴力,它肯定会超时。我不知道滑动窗是否能用。有人能给我一些关于如何进行的提示吗?显然,我并不要求得到完整的答案,只是一些提示对我有用。提前感谢:)

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

对于每个指数i,计算:

  • 如果未删除任何内容,则紧跟在其前面的1序列的长度
  • 如果在它之前删除了一个子串,则它前面可能紧接着的最长的1序列;及
  • 如果在它前面删除两个子串,则它前面最长的1序列
  • 对于每个索引,这三个值很容易在固定时间内从早期索引的值中计算出来,因此您可以在O(N)时间内一次性完成

    例如,设最佳(i,r)为移除r子字符串后紧靠位置i之前的最佳长度。如果i>=K,则可以删除以i结尾的子字符串,并将BEST(i,r)=BEST(i-K,r-1)用于r>0。如果string[i-1]=“1”则可以从上一个位置扩展序列,并使BEST(i,r)=BEST(i-1,r)+1。为每个i,r选择最佳可能性


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

    您能更精确地说明您正在最大化什么吗?@Scott Hunter我正在最大化字符串中连续1的数量。通过删除第三个零(长度为K的子串(是一个rn))和第四个零,我可以得到最大数量的连续零,即4。那么您是在最大化1的最长连续运行的长度?(准确地重述你已经说过的话无助于澄清任何事情。)你可以通过前缀和在O(n)时间内做到这一点。@scott hunter是的。连续意味着步骤3是否假定移除的子字符串是相邻的?如果不是,它是如何在O(1)时间内计算的?不,我会加一点