1 条题解
-
0
📝 题目大意
给定一个由小写字母、
,和"组成的字符串 ("出现偶数次),将相邻"两两配对形成若干"被括起来的区域"。要求把不在任何括起来区域内的逗号,全部替换为句点.,其余字符保持不变,输出替换后的字符串。💡 解题思路
-
题目分析:
- , 可过。
- 题目保证
"出现偶数次,且配对方式为 依次配对,不会有嵌套或交叉的情况。 - 核心任务是判断每个字符是否处于"被括起来的区域"内部。
-
算法推导:
- 用一个计数器
cnt记录当前已经扫描到的"的个数。 - 当
cnt为偶数时,说明当前处于所有配对的"之外(或恰好刚结束一个配对),此时遇到的,需要替换为.。 - 当
cnt为奇数时,说明当前处于某对"的内部,此时遇到的,应保留。 - 遍历字符串,遇到
"就将cnt加 1;遇到,且cnt % 2 == 0时将其改为.。 - 扫描完毕后直接输出修改后的字符串即可。
- 用一个计数器
-
边界与细节:
- 字符串中可能没有
"(此时cnt始终为 ,所有,都会被替换为.),如样例 2。 - 字符串可能以
"开头或结尾,算法仍然正确。 - 注意判断顺序:必须先判断
,是否需要替换,再判断"并更新cnt。因为遇到"时,该字符本身不属于任何配对内部,且"本身不是,,不会被误判。
- 字符串中可能没有
⏱️ 复杂度分析
- 时间复杂度:,只需遍历字符串一次。
- 空间复杂度:,存储输入字符串(不含输入输出缓冲则是 额外空间)。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; int main(){ int N; string S; cin >> N >> S; int cnt = 0; // 已经遇到的 " 的个数 for(int i = 0; i < N; i++){ // 遇到逗号时,如果 cnt 为偶数,说明不在任何引号区域内,替换为 . if(S[i] == ','){ if(cnt % 2 == 0){ S[i] = '.'; } } // 遇到引号时,计数加一(必须在逗号判断之后,避免引号本身被误判) if(S[i] == '"'){ cnt++; } } cout << S; return 0; } -
- 1
信息
- ID
- 670
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者