单词替换
题目链接:ybt高效进阶2-1-3
题目大意
输入一个字符串,以回车结束。
该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。
现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
思路
这道题内容其实很容易实现,就每找到一个单词,判断一下是不是要更改的。
如果是,就输出更改后的,否则就输出原来了。
但是这道题读入非常的烦人,恶心。(反正我是一直错了好久)
(第一次,我是用 gets,然后在 Lunix 上样例都不会转,而且别的还 RE 了)
(第二次,我改成了用 getchar 来一个一个读入,结果全都 RE了)
(第三次,同一个道理,不过看了很久之后发现处理最后一个单词的部分本来是应该输出到
n
−
1
n-1
n−1,我弄成了
n
n
n,就 RE 了)
(第四次,把上面发现的问题改了过来,发现 TLE,应该是因为最后一行并没有换行符,第三个 while 读不到换行符,就退出不了,就 TLE 了)
(第五次,又用回了 gets,然后发现用 gets 读入会把换行符也读入)
(第六次,问了 GJY,试了一下 getline,发现还是会读入换行符。然后就想到了一个方式:算字符串长度的时候减一,就把最后的换行符自动忽略了)
代码
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int sn, st, an, bn;
string s, a, b;
bool nc;
int main() {
getline(cin, s);
getline(cin, a);
getline(cin, b);
sn = s.size() - 1;//这样读入的时候会吧换行符读进去,所以算长度的时候要去掉换行符
an = a.size() - 1;
st = 0;
nc = 1;
for (int i = 0; i < sn; i++) {
if (s[i] == ' ') {
if (nc && (i - 1) - st + 1 == an) {
cout << b;
printf(" ");
}
else {
for (int j = st; j <= i; j++)
putchar(s[j]);
}
st = i + 1;
nc = 1;
}
else {
if (nc && (i - st + 1 > an || s[i] != a[i - st])) nc = 0;
}
}
if (nc && (sn - 1) - st + 1 == an) {
cout << b;
printf(" ");
}
else {
for (int j = st; j < sn; j++)
putchar(s[j]);
}
return 0;
}