String 关于二进制字符串的数学难题
我得到了一个长度为n的二进制字符串,我需要找到执行操作的最小数目,这样字符串就不会包含超过k个连续相等的字符 唯一允许我执行的操作是翻转字符串的任何第I个字符。翻转字符意味着将“1”更改为“0”或将“0”更改为“1” 例如: 如果n=4,k=1,字符串=1001 然后回答: 字符串=1010,最小操作数=2 我还需要找到新的字符串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=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++;
}