题意:给定一定长度的字符串,要求规则必须是所有大写字母必须在小写字母的前面,也就是所谓的11111000模式。
思路:暴力,用O(n)的算法处理一下字符串,得到每个字符位前面有多少位小写以及后面有多少大写。然后遍历枚举即可。注意全是大/小写的情况。
code:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
char s[N];
int d1[N],d2[N];
int main()
{
scanf("%s",s);
int n=strlen(s);
int ans=0,p1=0,p2=0;
memset(d1,0,sizeof(d1));
memset(d2,0,sizeof(d2));
for (int i=0;i<n;i++){
if (i!=0)d1[i]=d1[i-1];
if (s[i]>='a'&&s[i]<='z'){
if (i==0) d1[i]=1;else d1[i]=d1[i-1]+1;
}
}
for (int i=n-1;i>=0;i--){
if (i!=n-1) d2[i]=d2[i+1];
if (s[i]>='A'&&s[i]<='Z'){
if (i==n-1) d2[i]=1;else d2[i]=d2[i+1]+1;
}
}
for (int i=0;i<n;i++) if (s[i]>='a'&&s[i]<='z') ans++;
ans=min(ans,n-ans);
for (int i=0;i<n;i++)
ans=min(ans,d1[i]+d2[i]-1);
printf("%d\n",ans);
}