C++ 查找最大为k的最长二进制子序列的长度

C++ 查找最大为k的最长二进制子序列的长度,c++,algorithm,C++,Algorithm,正如在标题中所看到的,我需要找到最长的二进制子序列的长度,其中最多有k个。例如: k=3,二进制顺序=11100001101010000011,答案是:10(因为最长的子序列是11100001101011010000011) k=1,二进制顺序=00101001001,答案是:5(因为最长的子序列是00101001001) 我做了,但时间是二次的(我猜) #包括 #包括 使用名称空间std; 模板 无效波普_前(V&V) { v、 擦除(v.begin()); } int main(){ int

正如在标题中所看到的,我需要找到最长的二进制子序列的长度,其中最多有
k
个。例如:

k=
3
,二进制顺序=
11100001101010000011
,答案是:10(因为最长的子序列是11100001101011010000011)

k=
1
,二进制顺序=
00101001001
,答案是:5(因为最长的子序列是00101001001)

我做了,但时间是二次的(我猜)

#包括
#包括
使用名称空间std;
模板
无效波普_前(V&V)
{
v、 擦除(v.begin());
}
int main(){
int k,maxLength=0,lengthOfSequence;
布尔一号;
字符串bin_seq;
长度顺序=1;
矢量糜棱岩;
cin>>k;
cin>>bin_seq;
用于(字符数:bin_seq){
myList.push_back(0);
如果(num='1'){
对于(int i=0;ik){
pop_front(myList);
长度顺序--;
}
}
cout您可以使用此算法在O(n)中执行此操作:

  • 制作两个索引,一个用于所需子序列的开始,一个用于所需子序列的结束
  • 通过增加
    end
    索引继续扩展序列,直到到达
    k+1
    -st
    1
  • 在继续扩展序列超过
    k+1
    -st
    1
    之前,请通过“拉入”起始点来缩小序列,跳过序列中最早的
    1
  • 每次通过增加
    end
    扩展序列时,记录序列的最大长度
  • 一旦到达序列的末尾,
    max
    将拥有最长的子序列,其中最多包含
    k
使用此算法,您可以在O(n)中执行此操作:

  • 制作两个索引,一个用于所需子序列的开始,一个用于所需子序列的结束
  • 通过增加
    end
    索引继续扩展序列,直到到达
    k+1
    -st
    1
  • 在继续扩展序列超过
    k+1
    -st
    1
    之前,请通过“拉入”起始点来缩小序列,跳过序列中最早的
    1
  • 每次通过增加
    end
    扩展序列时,记录序列的最大长度
  • 一旦到达序列的末尾,
    max
    将拥有最长的子序列,其中最多包含
    k

假设输入为11010110000011

1101011010000011
fedcba9876543210  << Bit Positions 

假设输入为11010110000011

1101011010000011
fedcba9876543210  << Bit Positions 

这是O(n)问题。一圈。想做就做不要创建类似于
myList
的内容。使用迭代器/索引。这是O(n)问题。一圈。想做就做不要创建类似于
myList
的内容。使用迭代器/索引。除了
k+1-st1
之外,我什么都懂。你是说
k+1-startPosition==1
之类的吗?我只理解
-st
1
@PiotrWasilewicz之间的这个空格,在你的
“111000011010101000011”
k==3
的例子中,
k+1
-st
1
(第4位
1
)的零基位置是
7
。您将子序列扩展到
“1110000”
,然后到达第4个
1
,因此您必须拉入起始索引以到达
“1100001”
,然后到达
“10000110”
,依此类推。哦,我现在明白了。现在算法很简单。非常感谢。我什么都懂,除了
k+1-st1
你的意思是
k+1-startPosition==1
之类的吗?我只理解
-st
1
@PiotrWasilewicz之间的这个空格,在你的
“111000011010101000011”
k==3
的例子中,
k+1
-st
1
(第4位
1
)的零基位置是
7
。您将子序列扩展到
“1110000”
,然后到达第4个
1
,因此您必须拉入起始索引以到达
“1100001”
,然后到达
“10000110”
,依此类推。哦,我现在明白了。现在算法很简单。非常感谢。
For K = 3
Array: 0 1 7 9 a c e f
i,j:   ^   ^
       max = 9 - (0-1) - 1

      -----------------------

       0 1 7 9 a c e f
i++,j++: ^   ^      
      max = (arr[j+1] - arr[i-1]) - 1
          = a - 0 - 1 = 9

      -----------------------

      0 1 7 9 a c e f
          ^   ^     
      max = (arr[j+1] - arr[i-1]) - 1
          =   c - 1 - 1 = 12- 1- 1 = 10 (as 10 > 9)

      -----------------------

      0 1 7 9 a c e f
            ^   ^       
      max = (e - 7) - 1 = 14 - 7 - 1 = 6. So max = 10

      -----------------------

      0 1 7 9 a c e f
              ^   ^     
      max = f-9 - 1 = 15-9-1 = 5 (<10).

      -----------------------

          0 1 7 9 a c e f
                    ^   ^       
      max = (f+1) - a - 1 = 16-10-1 = 5 (<10).


      So, max = 10;