题目

小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 为止。整体逻辑:找到 → 替换 → 跳过 → 再找,直到找不到。

C++ · p35.cpp
#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 条件自然判断是否结束。

← 返回菜鸟的coding