原题
=====
给你一个仅由字符 '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}