题意:给定一定长度的字符串,要求规则必须是所有大写字母必须在小写字母的前面,也就是所谓的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);
}