我得到了一个长度为n的二进制字符串,我需要找到要执行的最小操作数,使得字符串不包含超过k个连续的相等字符。
我唯一允许执行的操作是翻转字符串中的任何第i个字符。翻转字符意味着将'1'更改为'0'或将'0'更改为'1'。
例如:
如果n = 4,则k = 1且string = 1001
然后回答:
string = 1010,最小操作= 2
我还需要找到新的字符串。
任何人都可以告诉我一个有效的算法来解决问题,考虑到n <= 10 ^ 5
答案 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++;
}