题目描述
小明很喜欢打字,今天小红给了小明一个字符串。
这个字符串只包含大写和小写字母。
我们知道,按下CapsLock键,可以切换大小写模式。
我们在小写模式时候,同时按下shift+字母键,就能写出大写字母。
在大写模式的时候,按下shift+字母键,就能写出小写字母。
现在问题来了,给你一个字符串,问你最少使用多少个按键,就可以写出这个字符串呢?
注意,按shift和字母键,算两次按键。开始时均为小写状态。
输入描述
第一行一个T,表示有T组输入。
接下来T组数据:
每组数据一个字符串s,s的长度小于等于100。仅包含大小写字母。
输出描述
对于每组数据,输出最少按键次数。
解题思路
- 每个字符算一次键入次数;
- 当输入字符与当前输入状态不匹配时,需要额外键入shift或Capslock用于切换输入状态;
- 当前待输入字符及其之后的字符均是同一种输入状态时,显然用CapsLock切换更为划算,而仅有一个字符需要切换,则适合采用shift;
仅有字母字符输入才涉及大小写切换,其余字符不涉及大小写切换
所以有必要判断字符是否属于字母。
实现思路
- 引入currentCap记录当前输入状态;
- 获取字符串大小,作为基础键入次数;
- 遍历字符串,如果字符与当前输入状态不匹配,检查后一个字符是否同当前字符为相同的大小写状态,相同切换currentCap变量,视作按下CapsLock,否则不切换,但均需增加计数,视作按键切换;
代码实现
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> CalculateKeyCounts(const vector<string>& str)
{
int n = str.size();
vector<int> results(n);
while (n--)
{
int count = str[n].size(); //base count
bool currentCap = false;
// bool needCap;
// int smallCount = 0, bigCount = 1;
for (int i = 0; i < str[n].size(); i++)
{
if (str[n][i] >= 'A' && str[n][i] <= 'Z' && currentCap == false)
{
if (i < str[n].size() - 1 && (str[n][i + 1] >= 'A' && str[n][i + 1] <= 'Z'))
{
currentCap = true;
}
count++;
}
if (str[n][i] >= 'a' && str[n][i] <= 'z' && currentCap == true)
{
if (i < str[n].size() - 1 && (str[n][i + 1] >= 'a' && str[n][i + 1] <= 'z'))
{
currentCap = false;
}
count++;
}
}
results[n] = count;
}
return results;
}
int main()
{
int T;
cin >> T;
vector<string> str(T);
for (int t = 0; t < T; t++)
{
cin >> str[t];
}
vector<int> results = CalculateKeyCounts(str);
for (auto result : results)
{
cout << result << endl;
}
return 0;
}
水平有限,如有错误,欢迎指正