使二进制字符串字符交替的最少反转次数

该博客讨论了一个关于二进制字符串的问题,探讨如何在保持字符串交替的同时,通过最少的反转次数达到目标。博主分析了问题的关键在于[1...k]部分的反转对整体反转次数的影响,并解释了如何计算最小反转次数。最后,博主提供了代码实现来解决这个问题。

一、问题

二、问题分析

这问题跟之前交换二进制字符串挺像的,刚开始想当然以为类型二和那个问题一样,结果后来仔细一看这道题要比那道的操作步骤简单多了。

问题抽象化:我们将字符串设为[1...n],现在的问题是求出这个字符串的最少变更次数。而第一步操作可以描述为:从[1...n]中选取[1...k]附加到[k+1...n]后面,即[k+1...n,1...k],我们发现中间部位[k+1...n]是不变的,而只有[1...k]的整体变动,然而这[1...k]的变动对[1...k]的转换次数并不会产生影响,为什么呢?

首先,对于交替,我们有两种情况:[01.....],[10......]。

其次,[k+1...n]有上面两种情况,[1...k]也有上面两种情况,然而当[1...k]移到[k+1...n]之后时,[1...k]的交替情况就会受到[k+1...n]的影响,也就是产生笛卡尔积,变成四种情况了。

最后,假设[k+1...n]单个的反转次数分别为:n1,n2分别对应[01......],[10......],[1...k]单个的反转次数分别为:k1,k2。则二者组合可能产生的次数为:n1+k1, n1+k2, n2+k1, n2+k2

而两者组合反转次数最少的就是min(n1+k1, n1+k2, n2+k1, n2+k2)

我们只需将每个元素遍历一次即可得到整个字符串的最小反转次数。

三、代码实现:

var minFlips = function(s) {
    let len = s.length;
    let mixs = new Array(len);
    //mixs.fill([0,0]);
    //注意这里用fill这样会导致之后的每个用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值