1758. 生成交替二进制字符串的最少操作数

197 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

题目 leetcode.cn/

  • 给你一个仅由字符 '0' 和 '1' 组成的字符串 s 。一步操作中,你可以将任一 '0' 变成 '1' ,或者将 '1' 变成 '0' 。
  • 交替字符串 定义为:如果字符串中不存在相邻两个字符相等的情况,那么该字符串就是交替字符串。例如,字符串 "010" 是交替字符串,而字符串 "0100" 不是。
  • 返回使 s 变成 交替字符串 所需的 最少 操作数。

示例

  • 输入: s = "0100",输出:1

    • 解释: 如果将最后一个字符变为 '1' ,s 就变成 "0101" ,即符合交替字符串定义。
  • 输入: s = "10",输出:0

    • 解释:s 已经是交替字符串。
  • 输入: s = "1111",输出:2

    • 解释:需要 2 步操作得到 "0101" 或 "1010" 。

提示

  • 1 <= s.length <= 100000
  • s[i]'0'或者'1'

代码

function minOperations(s: string): number {
    let sum0 = 0;
    let sum1 = 0;
    for(let i = 0; i < s.length; i++){
        if(i%2 === 0 && s[i] !== '0'){
            sum0++;
        }else if(i%2 === 1 && s[i] !== '1'){
            sum0++;
        }
    }
    for(let i = 0; i < s.length; i++){
        if(i%2 === 0 && s[i] !== '1'){
            sum1++;
        }else if(i%2 === 1 && s[i] !== '0'){
            sum1++;
        }
    }
    return sum0 > sum1 ? sum1 : sum0;
};

思路

  • 将给到的一串由01组成的无序字符串生成为交替二进制字符串,交替的二进制字符串是有序的,分为两种排序方式
    • 0开头,01010101010101010101010
    • 1开头,10101010101010101010101
  • 也就是说,无论给到的字符串是什么顺序的,最后转换成交替的二进制字符串都是以上两种之一,最后只要比较替换成上面的哪一种的操作最少就可以
  • 定义两个变量,分别用来保存替换成以0开头和以1开头的二进制字符串所需要的操作数
  • 遍历整个字符串,如果是以0开头的字符串,偶数位一定都是0,说以如果偶数位不是0的需要替换成0,操作次数+1,奇数位一定是1,奇数位不是1的需要替换成1,操作数也要+1
  • 同样,如果是以1开头的字符串,偶数位一定都是1,说以如果偶数位不是1的需要替换成1,操作次数+1,奇数位一定是0,奇数位不是0的需要替换成0,操作数也要+1
  • 最后返回两个操作数中最小的就可以