1 条题解

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

    📝 题目大意

    给定一个长度为 NN 的小写字母字符串 SS,将其中所有连续出现的 na 替换为 nya,输出替换后的字符串。

    💡 解题思路

    1. 题目分析

      • N1000N \le 1000,数据规模很小,可以直接遍历处理。
      • 替换规则:将 na 变成 nya,本质上是在 na 之间插入一个 y
      • 关键在于理解"连续出现"的含义:如 naan 中,第一个 na 和第二个 na 共享了中间的 a,但这里每个 na 是独立匹配的——n a a n 中第 1-2 位是 na,第 3-4 位不是 na(因为 anna),所以结果应为 nyaan
    2. 算法推导

      • 遍历字符串,对于每个位置 ii(从 11 开始),检查 S[i1]S[i-1]S[i]S[i] 是否构成 na
      • 如果 S[i1]=’n’S[i-1] = \text{'n'}S[i]=’a’S[i] = \text{'a'},则在输出 n 之后额外输出一个 y,再输出 a
      • 参考 std.cpp 的简洁写法:先输出 S[0]S[0],然后从 i=1i=1 开始遍历:
        • s[i] == 'a' && s[i-1] == 'n',输出 "ya"(相当于先补 y 再输出 a);
        • 否则直接输出 s[i]
      • 这样一趟扫描即可完成所有替换,无需真的修改原串。
    3. 边界与细节

      • SS 中没有 na 时,直接原样输出即可(如样例 2 nearnear)。
      • 重叠情况:nananyanya,因为位置 1-2 是 na(变成 nya),位置 3-4 也是 na(变成 nya),互不干扰。
      • 注意 s[0] 单独输出,循环从 i=1 开始,避免了越界判断。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),仅需一次线性扫描。
    • 空间复杂度O(1)O(1),仅使用常数级额外空间。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    string s;
    int main()
    {
        cin >> n >> s;
        // 先输出第一个字符
        cout << s[0];
        // 从第二个字符开始遍历
        for(int i = 1; i < s.size(); i++)
            // 如果当前位置是 'a' 且前一个是 'n',说明遇到了 "na"
            // 输出 "ya" 相当于在 'n' 后面插入 'y',再输出 'a'
            if(s[i] == 'a' && s[i - 1] == 'n')
                cout << "ya";
            else
                cout << s[i];  // 否则直接输出当前字符
    }
    
    • 1

    信息

    ID
    676
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者