单词替换 题目来源:牛客网
知识点:字符串,string,getline(),substr()
输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
多组数据。每组数据输入包括3行,
第1行是包含多个单词的字符串 s,
第2行是待替换的单词a,(长度<=100)
第3行是a将被替换的单词b。(长度<=100)
s, a, b 最前面和最后面都没有空格.
每个测试数据输出只有 1 行,
将s中所有单词a替换成b之后的字符串。
(1)输入一个字符串(getline(cin,str));
(2)找待替换单词的位置;
(3)如何替换单词;
(4)单词替换后字符串需要做什么处理;
#include
using namespace std;
void fun(string str,string x,string y){
int t[80],k; //记录待替换单词出现的位置
for(k=0;k<80;k++)t[k]=-1;
int i=0,j=0;
k=0;
while(i=0;k++){
str.erase(t[k],x.size());
str.insert(t[k],y); //替换单词
if(t[k+1]>=0) t[k+1]-=(k+1)*(x.size()-y.size()); //替换单词所导致位置偏移
}
cout<
(1)主函数,输入三个字符串getline(cin,str);
(2)fun函数:
1)定义整数数组t[80],用来记录字符串中待替换单词首字母的位置,利用for循环初始值设为-1;
2)定义i,j变量,i用来记录单词首字母的位置,j用来记录单词尾字母的位置;
3)确定单词的开头
while(str[i]==' ')
i++;
4)根据开头确定单词结尾的位置,因为i为一个单词的开头,赋值给j,j+1为下一个字母的位置,从str[j+1]判断是否为空;
j=i;
while(str[j+1]!=' '&&j
5)判断 是否为待替换的单词,在算法笔记---字符子串以及substr()的应用中已经提到substr()的用法,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。返回值为一个子字符串。
这里的substr(i,j-i+1)的意思为,从i开始,复制长度为j-i+1的子字符串
若找到了待替换的单词,则将该单词的首字母记录在t[ ]数组中,继续查找是否还有其他待替换的单词;
if(str.substr(i,j-i+1)==x) //当前单词是否是待替换的单词
t[k++]=i;
i=j+1;
6)待记录下所有代替换单词的首字母后,开始替换
str.erase(t[k],x.size());
str.insert(t[k],y);
7)替换单词后,若被替换的单词和替换的单词的长度不一致,那么替换后会导致代替换单词首字母的位置发生变换,因此除去第一个要替换的单词,其余都要修改t[k+1]的位置;
if(t[k+1]>=0) t[k+1]-=(k+1)*(x.size()-y.size()); //替换单词所导致位置偏移
8)因为最开始将t[k]都赋值为-1,所以在判断是否还有其他待替换的单词时,判断t[k]>=0即可。