算法笔记--字符串--将字符串中的某个单词替换成另一个单词,并输出替换之后的字符串

单词替换  题目来源:牛客网

知识点:字符串,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即可。


输出示例:

算法笔记--字符串--将字符串中的某个单词替换成另一个单词,并输出替换之后的字符串_第1张图片

 

 

 

 

 

 

你可能感兴趣的:(算法学习)