题意:
如果一个字符串不包含 "010 "或 "101 "的子序列,则称为好字符串–例如,"1001 "包含 "101 "的子序列,因此它不是一个好字符串,而 "1000 "既不包含 "010 "也不包含 "101 "的子序列,所以它是一个好字符串。
那么,他最少要进行多少次操作才能使该字符串成为好字符串?可以证明,通过这些操作,我们可以使任何字符串变得良好。
思路:
010和101作为子串的情况都不能出现,那么母串出现0紧接着1的时候之后就不能出现0了,所以母串可能是00111or1110or1101,当然第三种情况会被视为101,所以也不能出现,所以答案串有几种情况:①:0000000,②000111,③111111,④111000,计算答案的时候可以把0开头和1开头分两种情况~计算答案的时候还有小细节我的处理是:
利用前缀和对于前面两种情况枚举边界的位置,答案数就是之后的0+之前的1和之前的1+之后的0取min~
#include<bits/stdc++.h>
using namespace std;
char s1[1005];
int sum0[1005],sum1[1005];
int main()
{
int n,i,j,t;
cin>>t;
while(t--)
{
cin>>(s1+1);s1[0]='x';
sum0[0]=0,sum1[0]=0;
for(i=1;i<strlen(s1);i++) //0开头的情况
{
if(s1[i]=='0')
sum0[i]=sum0[i-1]+1,sum1[i]=sum1[i-1];
else
sum1[i]=sum1[i-1]+1,sum0[i]=sum0[i-1];
}
int d1=strlen(s1)-1;
int ans=0x3f3f3f3f;
for(i=1;i<strlen(s1);i++)
{
ans=min({ans,((sum0[d1]-sum0[i])+(sum1[i-1])),(sum0[i-1]+sum1[d1]-sum1[i])});
}
ans=min({ans,d1-sum0[i-1],d1-sum1[i-1]});
cout<<ans<<endl;
}
return 0;
}