1 条题解
-
0
📝 题目大意
给定一个长度为 的小写字母字符串 ,将其中所有连续出现的
na替换为nya,输出替换后的字符串。💡 解题思路
-
题目分析:
- ,数据规模很小,可以直接遍历处理。
- 替换规则:将
na变成nya,本质上是在n和a之间插入一个y。 - 关键在于理解"连续出现"的含义:如
naan中,第一个na和第二个na共享了中间的a,但这里每个na是独立匹配的——n a a n中第 1-2 位是na,第 3-4 位不是na(因为an≠na),所以结果应为nyaan。
-
算法推导:
- 遍历字符串,对于每个位置 (从 开始),检查 和 是否构成
na。 - 如果 且 ,则在输出
n之后额外输出一个y,再输出a。 - 参考 std.cpp 的简洁写法:先输出 ,然后从 开始遍历:
- 若
s[i] == 'a' && s[i-1] == 'n',输出"ya"(相当于先补y再输出a); - 否则直接输出
s[i]。
- 若
- 这样一趟扫描即可完成所有替换,无需真的修改原串。
- 遍历字符串,对于每个位置 (从 开始),检查 和 是否构成
-
边界与细节:
- 当 中没有
na时,直接原样输出即可(如样例 2near→near)。 - 重叠情况:
nana→nyanya,因为位置 1-2 是na(变成nya),位置 3-4 也是na(变成nya),互不干扰。 - 注意
s[0]单独输出,循环从i=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
- 上传者