题目描述
驼峰命名法是起变量名的一种规范,大致来说是用混合的大小写字母来构成变量名,在这个问题里你可以假设具体规则如下:
1.每个变量名由至少2个单词拼接构成,且每个单词长度至少为2;
2.每个单词的首字母必须大写,其他位置必须小写(除了变量名的第一个单词允许全部小写外)。
但是SK同学的英语很差,看到长长的变量名就很难脑补出是由哪些单词组成的,因此看驼峰命名法的代码十分头疼。
还有一种下划线命名法,规则比较简单,即各个单词之间用下划线'_'连接,且字母全部小写。
现在给你一些变量名,你能将其中符合驼峰命名法规范的变量转换成下划线命名法吗?
输入描述:
第一行是一个正整数T(≤ 20000),表示测试数据的组数, 每组测试数据只有一行,包含一个仅包含大小写英文字母且长度不超过20的变量名, 保证所有测试数据变量名长度总和不超过200000。
输出描述:
对于每组测试数据,输出一行,包含一个字符串,如果变量名符合驼峰命名法规范则将其改为下划线命名法,否则不变。
示例1
输入
10 mystring myString String SS my mySString mString STRING StrinG IndexOfString
输出
mystring my_string String SS my mySString mString STRING StrinG index_of_string
坑点:第二个字母不能是大写字母。。。
思路:第二个和最后一个英文字母不能是大写,不能有两个连续的大写字母,不能全是小写字母,其余的直接转换即可。
ACDAIMA:
#include <bits/stdc++.h> #define ll long long using namespace std; int main() { int t; cin >> t; string s; while(t--) { cin >> s; bool flag = true; int index = 0, ans = 1, len = s.length(); for(int i = 1; i < len; i ++) { //第二个和最后一个英文字母不能是大写,不能有两个连续的大写字母,不能全是小写字母 if(s[i] >= 'A' && s[i] <= 'Z' && i == index + 1) { flag = false; break; } else if(s[i] >= 'A' && s[i] <= 'Z') index = i, ans++; } if(ans == 1||!flag || (index == len-1)) cout << s << endl; else { for(int i = 0; i < len; i ++) { if(s[i] >= 'A' && s[i] <= 'Z' && i != 0) { printf("_%c",s[i]+32); } else if(s[i] >= 'A' && s[i] <= 'Z' && i == 0) { printf("%c",s[i]+32); } else cout << s[i]; } cout << endl; } } return 0; }