题目描述
GuoZQ正在打字,需要打的字只有大写和小写字母。他发现他在打字的时候,如果遇见大写字母,他可以先打开CapsLock键,使得CapsLock指示灯亮起来,即默认输入大写,这样他直接打上去的字母就是大写字母;他还可以用另一种办法,那就是在保证CapsLock灯关闭的状态下,即默认输入小写,使用Shift键+字母键的组合形式来输入大写字母。如果GuoZQ遇到的了一连串的大写字母,聪明的他可能先将CapsLock打开,然后连续输入这些大写字母,然后再关掉CapsLock。现在他发现,这两种写法都很好玩,但是对于一个给定的字符串,他想知道最少按多少次键能写完?而且GuoZQ的强迫症会使他保证打完字后CapsLock灯要关掉哦!开始的时候CapsLock是关闭的。
输入格式
多组输入数据,每组一个字符串,长度不为0且不超过100。输入以文件尾结束。
输出格式
对于每组输入数据,输出最少需要按键几次,每组输出占一行。
注意2个组合键算2次按键操作。
输入样例
Pirates
HDUacm
HDUACM
输出样例
8
8
8
/*
重点解决大写字母连续与不连续的情况
*/
#include<iostream>
#include<string.h>
using namespace std;
char sj[105];
int gx=0; //更新下标
int lxdx(int x,int len)
{
int res=1; //进入函数时已有一个大写字母
for(int i=x;i<len;i++)
{
if(sj[i+1]>='A'&&sj[i+1]<='Z')
{
res++;
gx=i; //更新下标
}
else
{
return res;
}
}
}
int main()
{
while(cin>>sj)
{
int res=0;
int len=strlen(sj);
for(int i=0;i<len;i++)
{
if(sj[i]>='A'&&sj[i]<='Z')
{
int lxsj=lxdx(i,len);
if(lxsj>=2)
{
res=lxsj+2;
i=gx+1; //大写字母连续时更新下标+1,下次循环从下一位开始,不懂手写推演“HDUacm”
}
else
{
res=lxsj+1;
}
}
else if(sj[i]>='a'&&sj[i]<='z')
{
res++;
}
}
cout<<res<<endl;
}
return 0;
}