1 条题解

  • 0
    @ 2026-10-26 10:13:15

    思路与算法

    第一行完整读入原文,后两行读入目标词a和新词b。原文保证单词之间恰好一个空格,使用字符串流逐词读取。若整个单词等于a就输出b,否则输出原词;输出的相邻单词间插入一个空格。

    正确性说明

    字符串流在空格处切分,因此每次取得的恰是一个完整原单词。等于a的单词按要求替换为b,不等于a的完整单词保持原样,故不会误替换其他词内部的子串。逐词按原顺序输出,且原题分隔符均为单空格、首尾无空格,因此重建的分隔与原文协议一致,完成所有且仅所有目标词替换。相等比较区分大小写。

    复杂度

    设原文长度L,目标词长度A,新词长度B,原单词数W,最终输出长度R。构造字符串流O(L),逐词比较最坏O(L+WA),输出O(R),读取目标与新词O(A+B),总时间O(L+WA+A+B+R)。保存原文、字符串流副本和两个词需O(L+A+B)空间,当前单词最多O(L)已包含,初始化流的开销也已计入。L<=200,A和B<=100;替换可能使输出长于200。

    易错点

    必须整词相等,不能把YouTube内部的You替换。区分You和you。原文用getline,不在空格处截断。相邻词只输出一个空格,首尾无多余空格。新词可比旧词长,不能按原文200字符限制截断最终输出。

    参考代码(C++11)

    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
    int main() {
        string s, a, b;
        getline(cin, s);
        getline(cin, a);
        getline(cin, b);
        istringstream input(s);
        string word;
        bool first = true;
        while (input >> word) {
            if (!first)
                cout << ' ';
            cout << (word == a ? b : word);
            first = false;
        }
        cout << '\n';
    }
    
    • 1

    信息

    ID
    1702
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者