二进制字符串的数学难题

时间:2015-05-09 12:07:57

标签: string algorithm

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

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

例如:

如果n = 4,则k = 1且string = 1001

然后回答:

string = 1010,最小操作= 2

我还需要找到新的字符串。

任何人都可以告诉我一个有效的算法来解决问题,考虑到n <= 10 ^ 5

3 个答案:

答案 0 :(得分:3)

有一种方法:

$('.selectOptions').on('change', function() {

  var ageValue = $('#selectOptions2 option:selected').data('age');
  var nameValue = $('#selectOptions1 option:selected').data('name');
 // alert(nameValue + ' ' + ageValue);

  $('.dataTest').filter(function() {
    return this.dataset.name === nameValue || this.dataset.age === ageValue
  }).css("display", "block").siblings(".dataTest").css("display", "none");
});

对于k = 1你可以做到! 这里翻转意味着从1到0,反之亦然

答案 1 :(得分:1)

对于k = 1,只有两个可能的输出字符串 - 一个以0开头,另一个以1开头。您可以检查哪一个更接近输入字符串。

对于较大的k,您可以查看k + 1个相同字符的每个序列,并在内部修复它 - 而不更改任何一端的字符。对于一系列k&#39; &GT;你需要地板(k&#39; /(k + 1))翻转。不应该很难证明这是最佳的。

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

答案 2 :(得分: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

    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++;
    }