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

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

知识点:字符串,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<iostream>
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<str.size()&&j<str.size()){
        while(str[i]==' ')
            i++;                                            //确定一个单词的开头
        j=i;
        while(str[j+1]!=' '&&j<str.size())
            j++;                                            //确定一个单词的结尾
        if(str.substr(i,j-i+1)==x)                          //当前单词是否是待替换的单词
            t[k++]=i;                                       //记下位置
        i=j+1;                                              //i后移准备寻找下一个单词
    }
    for(k=0;t[k]>=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<<str<<endl;
}
 
int main(){
    string str;
    while(getline(cin,str)){
        string x,y;
        getline(cin,x);
        getline(cin,y);
        fun(str,x,y);
    }
    return 0;
}

代码 分析:

(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<str.size())
      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即可。


输出示例:

 

 

 

 

 

 

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值