题解 | 小美的01串翻转

小美的01串翻转

https://www.nowcoder.com/practice/a0effc0e1dd24412a8f47c5dde0da075

const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});
function getCost(str, s, e, c) {
    let r = 0;
    for (let i = s; i <= e; i++) {
        if (i & 1 && str[i] !== c) r++;
        if (!(i & 1) && str[i] === c) r++;
    }
    return r;
}

rl.on("line", (line) => {
    const tokens = line.split(" ");
    const str = tokens[0];
    const n = str.length;
    const dp = Array.from({length: n}, () => new Array(2))
    // dp[i][0] i位置应该是0的代价
    // dp[i][1] i位置应该是1的代价
    dp[-1] = [0, 0]
    dp[0][0] = parseInt(str[0])
    dp[0][1] = (str[0] ^ 1);
    for (let i = 1; i < n; i++) {
        dp[i][0] = dp[i - 1][1] + parseInt(str[i])
        dp[i][1] = dp[i - 1][0] + (str[i] ^ 1)
    }
    let res = 0
    for (let i = 0; i < n; i++) {
        for (let j = i + 1; j < n; j++) {
            // i ~ j 位置,包含i和j
            const num = (j - i + 1) % 2
            res += Math.min(
                // 当前位置是0
                // 从i到j有num个数字
                // num是奇数,i - 1位置就应该是 1
                // num是偶数,i - 1位置就应该是 0
                dp[j][0] - dp[i - 1][num],
                // 当前位置是1
                // 推论如上
                dp[j][1] - dp[i - 1][num ^ 1]
            )
        }
    }
    console.log(res)
});

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务