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

Raphael Liu Lv10

给你一个仅由字符 '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 <= 104
  • s[i]'0''1'

方法一:模拟

思路

根据题意,经过多次操作,s 可能会变成两种不同的交替二进制字符串,即:

  • 开头为 0,后续交替的字符串;
  • 开头为 1,后续交替的字符串。

注意到,变成这两种不同的交替二进制字符串所需要的最少操作数加起来等于 s 的长度,我们只需要计算出变为其中一种字符串的最少操作数,就可以推出另一个最少操作数,然后取最小值即可。

代码

[sol1-Python3]
1
2
3
4
class Solution:
def minOperations(self, s: str) -> int:
cnt = sum(int(c) != i % 2 for i, c in enumerate(s))
return min(cnt, len(s) - cnt)
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public int minOperations(String s) {
int cnt = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c != (char) ('0' + i % 2)) {
cnt++;
}
}
return Math.min(cnt, s.length() - cnt);
}
}
[sol1-C#]
1
2
3
4
5
6
7
8
9
10
11
12
public class Solution {
public int MinOperations(string s) {
int cnt = 0;
for (int i = 0; i < s.Length; i++) {
char c = s[i];
if (c != (char) ('0' + i % 2)) {
cnt++;
}
}
return Math.Min(cnt, s.Length - cnt);
}
}
[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int minOperations(string s) {
int cnt = 0;
for (int i = 0; i < s.size(); i++) {
char c = s[i];
if (c != ('0' + i % 2)) {
cnt++;
}
}
return min(cnt, (int)s.size() - cnt);
}
};
[sol1-C]
1
2
3
4
5
6
7
8
9
10
11
12
#define MIN(a, b) ((a) < (b) ? (a) : (b))

int minOperations(char * s) {
int cnt = 0, len = strlen(s);
for (int i = 0; i < len; i++) {
char c = s[i];
if (c != ('0' + i % 2)) {
cnt++;
}
}
return MIN(cnt, len - cnt);
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
9
10
var minOperations = function(s) {
let cnt = 0;
for (let i = 0; i < s.length; i++) {
const c = s[i];
if (c !== (String.fromCharCode('0'.charCodeAt() + i % 2))) {
cnt++;
}
}
return Math.min(cnt, s.length - cnt);
};
[sol1-Golang]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func minOperations(s string) int {
cnt := 0
for i, c := range s {
if i%2 != int(c-'0') {
cnt++
}
}
return min(cnt, len(s)-cnt)
}

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

复杂度分析

  • 时间复杂度:O(n),其中 n 为输入 s 的长度,仅需遍历一遍字符串。

  • 空间复杂度:O(1),只需要常数额外空间。

 Comments
On this page
1758-生成交替二进制字符串的最少操作数