标准库自带的string函数有很多强大的功能,不需要使用复杂的算法(因为那些算法系统已经帮你设置好了),解题十分便捷。
这里使用到size(求长度)、find(查找子串位置)、replace(替换)等3种函数,只需要简单的操作就可以实现单词替换。

#include <iostream>
#include<string>
using namespace std;

int main() {
    string str;
    string a;
    string b;
    while (getline(cin, str)) { 
        cin >> a;
        cin >> b;
        size_t i = 0;
        size_t strlen = str.size();
        size_t alen = a.size();
        size_t blen = b.size();
        while (i < strlen) {
            size_t pos = str.find(a, i);//从位置i开始查找子串a的位置
            if (pos == -1) {  //-1代表没找到,退出查找
                break;
            }
            i = pos;
            if((i==0&&str[i+alen]==' ')||(i!=0&&str[i-1]==' '&&str[i+alen]==' ')||(i!=0&&str[i-1]==' '&&str[i+alen]=='\0')){ 
			  //易错点:本来已找到子串就可以直接替换,但由于题目说明是单词,因此需根据单词排版特性判断是否为单词:
			  //1、在句首的单词起始位置为0,且后面必须是空格;
			  //2、在句中的单词前后位置必须是空格;
			  //3、在句末的单词前面必须为空格,后面为结束符'/0';
			  //不满足其中一项条件,就不是要找的单词。
            str.replace(i, alen, b);//找到后,用replace函数对位置i后的子串a长度位用子串b替换即可
            i += blen;//查找位置向后移动至替换的单词后一位
            strlen = str.size();//重新计算str长度(循环条件更新)
            }else{//若找到的位置不是单词,则跳过a位,继续查找。
                i+=alen;
            }
        }
        cout << str ;
    }
}