- 使二进制字符串字符交替的最少反转次数
/**
* 1888. 使二进制字符串字符交替的最少反转次数
*
* 题目类型:滑动窗口、前缀和
* 分类型讨论
* n为偶数:
* 最终结果有两种:010101或者101010。
* 在n为偶数的情况下,移动字符串并不影响改变数字的操作次数,所以可以直接比较转换成两种情况下所花费的操作次数,寻找较小的操作次数。
*
* n为奇数:
* 最终有两种结果:10101或者01010
* 使用滑动窗口:复制一份字符串拼接 虚拟拼接:不必真实复制一份字符串拼接出来,直接使用 i + len即可获得拼接后的字符串位置
* 第一次检索 : 从头到尾,判断需要变更成相互间隔的字符串的所需要的操作的次数
* 注意:变换 01 和 10 的区别就是 001 —> 010 2次 001 -> 101 1次 次数之和为数组长度
* 滑动窗口 ,会导致字符滑出滑入 -> 字符滑出 如果该字符被更改,需要将更改次数减去 字符滑入 重新判断是否需要将其改变
*
*/
public class Solution1888 {
public int minFlips(String s) {
int res, cot = 0, len = s.length();
char[] target = new char[]{'0', '1'};
char[] string = new char[len];
for (int i = 0; i < len; i++) {
string[i] = s.charAt(i);
if (string[i] != target[i%2]) {
cot++;
}
}
res = Math.min(cot, len - cot);
for (int i = 0; i < len; i++) {
if (string[i] != target[i%2]) {
cot--;
}
if (string[i] != target[(i + len)%2]) {
cot++;
}
res = Math.min(res, Math.min(cot, len - cot));
}
return res;
}
}