给你一个仅由字符 '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"
首先,我们不需要去模拟转化字符的操作,只需要转化一下思维。对于交替字符串最终只可能有两种可能 010....0101 010....0101 010....0101和 1010....1010 1010....1010 1010....1010,那么我们只需要将s与这两个字符串进行对比统计最少的不同字符串个数即可。
class Solution {
public int minOperations(String s) {
int a = 0, b = 0, n = s.length();
char[] arr = s.toCharArray();
for (int i = 0; i < n; i++) {
a += arr[i] ^ '0' ^ (i & 1);// 01010101 比较
b += arr[i] ^ '1' ^ (i & 1);// 10101010 比较
}
return Math.min(a, b);
}
}
class Solution {
public:
int minOperations(string s) {
int a = 0, b = 0, n = s.size();
for (int i = 0; i < n; i++) {
a += s[i] ^ '0' ^ (i & 1);// 01010101 比较
b += s[i] ^ '1' ^ (i & 1);// 10101010 比较
}
return min(a, b);
}
};
class Solution {
public int minOperations(String s) {
int a = 0, b = 0, n = s.length();
char[] arr = s.toCharArray();
for (int i = 0; i < n; i++) a += arr[i] ^ '0' ^ (i & 1);// 01010101 比较
return Math.min(a, n - a);
}
}
class Solution {
public:
int minOperations(string s) {
int a = 0, b = 0, n = s.size();
for (int i = 0; i < n; i++) a += s[i] ^ '0' ^ (i & 1);// 01010101 比较
return min(a, n - a);
}
};