1 条题解

  • 0
    @ 2026-6-19 10:30:21

    📝 题目大意

    给定一个由小写字母、," 组成的字符串 SS" 出现偶数次),将相邻 " 两两配对形成若干"被括起来的区域"。要求把不在任何括起来区域内的逗号 , 全部替换为句点 .,其余字符保持不变,输出替换后的字符串。

    💡 解题思路

    1. 题目分析

      • N2×105N \le 2 \times 10^5O(N)O(N) 可过。
      • 题目保证 " 出现偶数次,且配对方式为 (1,2),(3,4),(1,2), (3,4), \dots 依次配对,不会有嵌套或交叉的情况。
      • 核心任务是判断每个字符是否处于"被括起来的区域"内部。
    2. 算法推导

      • 用一个计数器 cnt 记录当前已经扫描到的 " 的个数。
      • cnt 为偶数时,说明当前处于所有配对的 " 之外(或恰好刚结束一个配对),此时遇到的 , 需要替换为 .
      • cnt 为奇数时,说明当前处于某对 " 的内部,此时遇到的 , 应保留。
      • 遍历字符串,遇到 " 就将 cnt 加 1;遇到 ,cnt % 2 == 0 时将其改为 .
      • 扫描完毕后直接输出修改后的字符串即可。
    3. 边界与细节

      • 字符串中可能没有 "(此时 cnt 始终为 00,所有 , 都会被替换为 .),如样例 2。
      • 字符串可能以 " 开头或结尾,算法仍然正确。
      • 注意判断顺序:必须先判断 , 是否需要替换,再判断 " 并更新 cnt。因为遇到 " 时,该字符本身不属于任何配对内部,且 " 本身不是 ,,不会被误判。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),只需遍历字符串一次。
    • 空间复杂度O(N)O(N),存储输入字符串(不含输入输出缓冲则是 O(1)O(1) 额外空间)。

    💻 标准代码 (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
    上传者