# 菜鸟的coding · Day 018
海王
题目
小J是个海王,想把同一句话发给多个人,只需要把称呼替换掉。给定原始字符串 c、需要被替换的子串 x、替换后的字符串 y,把 c 中所有出现的 x 替换为 y(区分大小写,不重叠地从左到右替换)。
输入:共3行,分别为字符串 c、子串 x、替换串 y。
输出:替换后的字符串。
数据范围:c 长度不超过10000,x 长度不超过10,y 长度不超过1000。
样例:
输入
AnandoyouthinkthattalkingtoAnanaboutthingsrelatedtoananisenough Anan Wangwang
输出
WangwangdoyouthinkthattalkingtoWangwangaboutthingsrelatedtoananisenough
思路
用 s.find(x, pos) 从位置 pos 开始在 c 中查找子串 x,返回找到的下标;若找不到则返回 string::npos(一个表示"未找到"的特殊值)。找到后用 s.replace(pos, x.size(), y) 把从 pos 开始、长度为 x.size() 的部分替换成 y。
替换完后,下一次搜索从 pos + y.size() 开始,跳过刚换进来的 y,避免重复处理。如此循环直到 find 返回 string::npos 为止。整体逻辑:找到 → 替换 → 跳过 → 再找,直到找不到。
#include<bits/stdc++.h>
using namespace std;
int main(){
string c,x,y;
getline(cin,c);
getline(cin,x);
getline(cin,y);
int pos=c.find(x,0);
while(pos!=string::npos){
c.replace(pos,x.size(),y);
pos=c.find(x,pos+y.size());
}
cout<<c<<endl;
return 0;
}
复杂度分析
- 时间复杂度:O(n × m),n 为 c 的长度,m 为 x 的长度,每次 find 最坏扫描整串。
- 空间复杂度:O(1),直接在原串上修改。
今日感受
学会了几个常用的字符串函数:find 用来定位子串,replace 用来替换指定区间。最容易绕的是替换后的 pos 更新——替换完不能从原位置继续找,要跳过整个 y 的长度,从 pos + y.size() 重新开始,同时把 find 的结果直接赋回 pos,让 while 条件自然判断是否结束。