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

113 阅读2分钟

原题

=====

给你一个仅由字符 '0''1' 组成的字符串 s 。一步操作中,你可以将任一 '0' 变成 '1' ,或者将 '1' 变成 '0'

交替字符串 定义为:如果字符串中不存在相邻两个字符相等的情况,那么该字符串就是交替字符串。例如,字符串 "010" 是交替字符串,而字符串 "0100" 不是。

返回使 s 变成 交替字符串 所需的 最少 操作数。

示例 1:

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

示例 2:

 **输入:** s = "10"
 **输出:** 0
 **解释:** s 已经是交替字符串。

示例 3:

 **输入:** s = "1111"
 **输出:** 2
 **解释:** 需要 2 步操作得到 "0101""1010"

提示:

  • 1 <= s.length <= 10^4

  • s[i]'0''1'

难度 Easy

标签 字符串

题意分析 根据题意发现交替字符串只能出现2种情况。

  • 以1开头的,如:101010 / 10101

  • 以0开头的,如:010101 / 01010

得到其中一种计数后,用字符串的长度减去当前计数后就是另一种的计数,在这2个计数值里取最小值即可。

我们发现每个字符所在的key % 2后就是 0/1/0/1 这样的规律。

那么我们只需要一次遍历字符s,看每个字符和它所在key%2 是否相等,如果不相当则需要改变一次。这样计算出以0开头的计数。

复杂度分析

  • 时间复杂度分析: O(n)

  • 空间复杂度分析: O(1)

    func minOperations(s string) int { cnt := 0 for k, v := range s { if k%2 != int(v-'0') { cnt++ } } return min(cnt, len(s)-cnt) }

    func min(a, b int) int { if a < b { return a }

    return b
    

    }

力扣题库地址

leetcode-cn.com/problems/mi…