如何通过在字符串中进行k交换来制作p个连续字符?

时间:2017-03-12 08:50:05

标签: arrays string algorithm

有一个1's0's字符串,例如110001110。我已经给出了两个数字kp,我必须通过执行p检查我是否可以连续1's0'sk交换和交换我的意思是,如果它是1,那么将它0,反之亦然。

编辑 - 我想我没有明确解释过。 例如,让字符串为1110000111,让p = 3k = 1。因此,我可以通过1次掉头获得至少3个连续1's0's,其答案为yes,因为我可以将其更改为1110010111

1 个答案:

答案 0 :(得分:1)

您可以通过简单的循环在线性时间内完成此操作。在检测到全部0或全部1的单调序列后,您将计算使用简单公式需要多少次翻转。除了 p 为1的情况外,这些翻转总是可以使得该序列的外部数字保持不变。在这种情况下,必须使翻转得到01010101。 ..或者101010101 ....也可以使用简单的模数表达式完成。然后将采取两者中最好的(交换次数减少)。

以下是JavaScript中的一个实现,其中包含针对通用案例(p> 1)的两个示例运行以及提到的特殊情况(p = 1):

function swapsForMaxSequence(s, maxSize) {
    var head, tail, swaps;

    if (maxSize < 1) return false;
    
    swaps = 0;
    if (maxSize === 1) { // Special case
        // 0 and 1 should be alternating:
        for (head = 0; head < s.length; head++) { // n iterations
            if (Number(s[head]) == head % 2) swaps++;
        }
        // Either the made swaps or the opposite swaps would do it:
        return Math.min(swaps, s.length - swaps);
    }
    tail = 0;
    for (head = 1; head <= s.length; head++) { // n iterations
        if (head === s.length || s[head] != s[tail]) { // end of sequence?
            swaps += Math.floor((head - tail)/(maxSize+1));
            tail = head; // Start of new sequence
        }
    }
    return swaps;
}

// Sample input:
var s = '10110101010', // Special case
    k = 1,
    p = 1;

// Display input:
console.log('s:', s, 'k:', k, 'p:', p);

// Run the algorithm
result = swapsForMaxSequence(s, p);

// Display outcome:
console.log('result:', result);

// Second sample:
var s = '1110000111', // Special case
    k = 1,
    p = 3;

// Display input:
console.log('s:', s, 'k:', k, 'p:', p);

// Run the algorithm
result = swapsForMaxSequence(s, p);

// Display outcome:
console.log('result:', result);