L1-6 字母串

题目

英语老师要求学生按照如下规则写一串字母:

如果写了某个大写字母,下一个就必须写同个字母的小写,或者写字母表中下一个字母的大写;
如果写了某个小写字母,下一个就必须写同个字母的大写,或者写字母表中前一个字母的小写;
当然也可以什么都不写,就结束这个字母串。
例如 aAaABCDdcbBC 就是一个合法的字母串;而 dEFfeFGhI 就是非法的。注意 a 没有前一个字母, Z 也没有下一个字母。

现在面对全班学生交上来的作业,老师请你写个程序自动批改。

输入格式:
输入在第一行给出一个不超过 100 的正整数 N。随后 N 行,每行给出一位学生的作业,即仅由英文字母组成的非空字母串,长度不超过 2×10
6

输出格式:
对每位学生的作业,如果正确就在一行中输出 Y,否则输出 N。

输入样例:
2
aAaABCDdcbBC
dEFfeFGhI

输出样例:
Y
N

代码长度限制
16 KB
时间限制
800 ms
内存限制
64 MB
栈限制
8192 KB

代码

#include
using namespace std;
int main()
{
    int n;
    cin >> n; // 输入学生作业的数量
    for(int i = 1; i <= n; i++){
        string s;
        int flag = 1; // 标记该作业是否合法,初始为合法
        cin >> s; // 输入学生的作业字符串
        for(int j = 0; j < s.size() - 1; j++){ // 遍历字符串中的每个字符,除了最后一个
            if(s[j] >= 'A' && s[j] <= 'Z'){ // 如果当前字符是大写字母
                // 判断下一个字符是否为当前大写字母对应的小写字母,或者是字母表中下一个字母的大写
                if(s[j] == s[j + 1] - 32 || s[j] + 1 == s[j + 1]){ 
                    continue; // 满足规则,继续检查下一对字符
                }
                else{
                    cout << "N" << endl; // 不满足规则,输出 N
                    flag = 0; // 标记作业不合法
                    break; // 跳出内层循环,不再检查后续字符
                }
            }
            else if(s[j] >= 'a' && s[j] <= 'z'){ // 如果当前字符是小写字母
                // 判断下一个字符是否为当前小写字母对应的大写字母,或者是字母表中前一个字母的小写
                if(s[j] == s[j + 1] + 32 || s[j] - 1 == s[j + 1]){ 
                    continue; // 满足规则,继续检查下一对字符
                }
                else{
                    cout << "N" << endl; // 不满足规则,输出 N
                    flag = 0; // 标记作业不合法
                    break; // 跳出内层循环,不再检查后续字符
                }
            }
        }
        if(flag) cout << "Y" << endl; // 如果作业合法,输出 Y
    }
    return 0;
}

总结

  • ASCII中小写在前,大写在后。差32
  • 判断前应该字符和后一个字符时条件不要搞错误了,好好理解

你可能感兴趣的:(团队天梯赛,c++,算法,数据结构,开发语言,职场和发展)