String 关于二进制字符串的数学难题

String 关于二进制字符串的数学难题,string,algorithm,String,Algorithm,我得到了一个长度为n的二进制字符串,我需要找到执行操作的最小数目,这样字符串就不会包含超过k个连续相等的字符 唯一允许我执行的操作是翻转字符串的任何第I个字符。翻转字符意味着将“1”更改为“0”或将“0”更改为“1” 例如: 如果n=4,k=1,字符串=1001 然后回答: 字符串=1010,最小操作数=2 我还需要找到新的字符串 有谁能告诉我一个有效的算法来解决考虑n的问题吗?对于k=1,只有两个可能的输出字符串——一个以0开头,另一个以1开头。您可以检查哪一个更接近输入字符串 对于较大的k,

我得到了一个长度为n的二进制字符串,我需要找到执行操作的最小数目,这样字符串就不会包含超过k个连续相等的字符

唯一允许我执行的操作是翻转字符串的任何第I个字符。翻转字符意味着将“1”更改为“0”或将“0”更改为“1”

例如:

如果n=4,k=1,字符串=1001

然后回答:

字符串=1010,最小操作数=2

我还需要找到新的字符串


有谁能告诉我一个有效的算法来解决考虑n的问题吗?对于k=1,只有两个可能的输出字符串——一个以0开头,另一个以1开头。您可以检查哪一个更接近输入字符串

对于较大的k,您只需查看k+1相同字符的每个序列,并在内部对其进行修复,而无需更改两端的字符。对于k'>k的序列,您需要地板(k'/(k+1))翻转。不难证明这是最佳的

运行时间是线性的,额外空间是恒定的。

有一种方法:

if k>1:
    if k+1 matching characters are found:
        if a[k+1]==a[k+2]:
            flip a[k+1]
        else if a[k+1]!=a[k+2]:
            flip a[k]
对于k=1,你可以做到! 此处翻转表示从1到0,反之亦然。有两种情况:

1)For k>1
   We have 2 possibilities.
     a)one that is starting with 0:
       eg:0101010101
     b)one that is starrting with 1
       eg:10101010.....
We should now calculate the distance(the number of different elements between the 2 strings)for each possiblity.Then the ans will be the one that has minimum changes.
2) 对于k>1


你的问题是什么?我编辑的问题看起来像动态程序…@dummycpp如果输入字符串是1000,k=1,最终字符串是?最终字符串=1010,操作=1
    res2=0;res1=1;
    c1=A[i];//it represents the last elemnet
    i=1;
    while(A[i]!='\0'){
      if(A[i]==c1){
        res1++;//the no of consecutive elements
           if(res1>k){
               if(A[i]==A[i+1])
                  flip(i);//it flips the ith element
                else
                   flip(i-1);
                res2++;//it counts the no of changes
                res1=1;
            }            
       }
       else
         res1=1;

      c1=A[i];
      i++;
    }