times[i][0] 表示输入字符i后,大写键是关闭状态;times[i][1]:表示输入字符i后大写键是开启状态;
times[i][0]:是由times[i-1][0]和times[i-1][1]两种可能的状态决定的;同样times[i][1]:是由times[i-1][0]和times[i-1][1]两种可能的状态决定的;
如果如入第i个字符是大写字母则:
times[i][0] = min{times[i-1][0] + 2, times[i][1] + 2};
times[i][1] = min{times[i-1][0] + 2, times[i-1][1] + 1};
如果如入第i个字符是小写字母则:
times[i][0] = min{times[i-1][0] + 1, times[i][1] + 2};
times[i][1] = min{times[i-1][0] + 2, times[i-1][1] + 2};
Len 表示字符串的长度,由于在最后输入结束大写键要处于关闭状态,因此最后times[Len][1] += 1;
代码如下:
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MIN(a, b) (a > b ? b : a)
const int MAXN = 110;
char str[MAXN];
int times[MAXN][2];
bool CheckCapital( char s )
{
if(s >= 'A' && s <= 'Z')
return true;
else
return false;
}
void count()
{
int Len;
int ans = 0;
Len = strlen( str );
memset(times, 0, sizeof(times));
times[0][1] = 1;
for(int i = 1; i <= Len; ++i)
{
if(CheckCapital(str[i-1]))
{
times[i][0] = MIN(times[i-1][0] + 2, times[i-1][1] + 2);
times[i][1] = MIN(times[i-1][0] + 2,times[i-1][1] + 1);
}
else
{
times[i][0] = MIN(times[i-1][0] + 1, times[i-1][1] + 2);
times[i][1] = MIN(times[i-1][0] + 2,times[i-1][1] + 2);
}
}
times[Len][1] += 1;
ans = MIN(times[Len][0],times[Len][1]);
cout<<ans<<endl;
}
int main()
{
int N;
cin>>N;
while(N--)
{
cin>>str;
count();
}
return 0;
}