top1编程
← 返回题目
题解

【基础】小X与缩写

1 条题解

  • 0
    @ 2026-7-31 11:51:28

    解题思路

    题目要求把句子中括号里的词组替换成首字母缩写:把每个单词的首字母取出来、转成大写、连在一起。括号本身不输出,括号外的内容原样输出。

    思路:

    用一个标记 in 记录当前是否在括号内:

    1. 遇到左括号 (,把 in 设为 true,括号不输出
    2. 遇到右括号 ),把 in 设为 false,括号不输出
    3. 在括号内:如果是单词的首字母(前面是括号或空格),转大写输出
    4. 在括号外:原样输出

    怎么判断单词首字母? 一个单词的开头,它的前一个字符要么是左括号,要么是空格。所以检查 s[i-1] 是不是 '(' 或 ' ' 就行。

    怎么转大写? 小写字母转大写只要减去 32:char(s[i] - 32)。比如 'a' 是 97,减 32 得 65 正好是 'A'。

    举个例子:

    输入:The (longest increasing subsequence) problem

    括号内三个单词首字母分别是 l、i、s,转大写连成 LIS,输出:The LIS problem

    参考代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        string s;
        getline(cin, s);
    
        bool in = false;  // 是否在括号内
    
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(') {
                in = true;   // 进入括号
                continue;
            }
            if (s[i] == ')') {
                in = false;  // 离开括号
                continue;
            }
            if (in) {
                // 括号内:单词首字母转大写输出
                if (i > 0 && (s[i - 1] == '(' || s[i - 1] == ' ')) {
                    cout << char(s[i] - 32);
                }
            } else {
                cout << s[i];  // 括号外原样输出
            }
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),只遍历一次句子
    • 空间复杂度:O(1)
    • 1