题解
【基础】小X与缩写
1 条题解
-
0
解题思路
题目要求把句子中括号里的词组替换成首字母缩写:把每个单词的首字母取出来、转成大写、连在一起。括号本身不输出,括号外的内容原样输出。
思路:
用一个标记 in 记录当前是否在括号内:
- 遇到左括号 (,把 in 设为 true,括号不输出
- 遇到右括号 ),把 in 设为 false,括号不输出
- 在括号内:如果是单词的首字母(前面是括号或空格),转大写输出
- 在括号外:原样输出
怎么判断单词首字母? 一个单词的开头,它的前一个字符要么是左括号,要么是空格。所以检查 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