思路:最后结果只有两种情况,一种1010...,一种0101....,我们在原字符串中找出与这两种字符串不同的(需要反转)的字符串构成两个全新的字符串,然后开一个计数器,遍历新字符串,如果当前为0,则以0为底的字符串+1,若以1为底的字符串存在,则以1为底的字符串减1,反之同理,新字符串需改变的最小字符串个数为两者相加, 然后比较两个新字符串的的需改变的字符串大小即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int find(string s) {
int end0=0,end1=0;
if(s[0]=='0') end0++;
else end1++;
for(int i=1;i<s.size();i++) {
if(s[i]=='0') {
if(end1>0) {
end1--;
end0++;
}
else end0++;
}
else {
if(cnt0>0) {
end0--;
end1++;
}
else cend1++;
}
}
return end0+end1;
}
void slove() {
int n;cin>>n;
string flag1,flag2;
int flag=1;
for(int i=0;i<n;i++) {
if(flag==1) {
flag1+='0';
flag2+='1';
}
else {
flag2+='0';
flag1+='1';
}
flag*=-1;
}
string s;cin>>s;
string cnt1,cnt2;
for(int i=0;i<n;i++) {
if(flag1[i]!=s[i]) cnt1+=s[i];
if(flag2[i]!=s[i]) cnt2+=s[i];
}
cout<<min(find(cnt1),find(cnt2))<<endl;
}
int main() {
int t; cin>>t;
while(t--) slove();
}