1 条题解
-
0
思路与算法
第一行完整读入原文,后两行读入目标词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