B题
给定一个数列,该数列由0和1构成,如果其中含有010或者101的子序列,则是不好的序列, 需要用最少的操作将它变为好序列。
思路,有三种格式的序列是好的,比如00000…0000,111…111 ,1…110…000,000…0111…1;
那么其他的形式只要能转换为这四种之一即可。
那么可以求1的前缀和,然后先判断转换为全0或者全1的情况,然后再尝试逐一转换为前部分全0后部分全1 或者 前部分全1后部分全0.
来看这2n+2种情况谁最小。
import java.util.Scanner;
/**
* @创建人 YDL
* @创建时间 2020/5/31 17:05
* @描述
*/
public class Solution {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int test = Integer.parseInt(sc.nextLine());
while(test-->0) {
char[] cs = sc.nextLine().toCharArray();
int[] sums = new int[cs.length+1];
for(int i=0;i<cs.length;i++){
sums[i+1]=sums[i]+cs[i]-'0';
}
int ans = Math.min(sums[cs.length],cs.length-sums[cs.length]);
for(int i=0;i<cs.length;i++){
ans = Math.min(ans,sums[i+1]+cs.length-i-1+sums[i+1]-sums[cs.length]);
ans = Math.min(ans,i+1-sums[i+1]+sums[cs.length]-sums[i+1]);
}
System.out.println(ans);
}
}
}