题目 1621: 蓝桥杯算法训练VIP-字符串编辑

题目

从键盘输入一个字符串,并以字符’.’结束。编辑功能有:
1 D:删除一个字符,命令的方式为:D a 其中a为被删除的字符,例如:D s 表示删除字符’s’,若字符串中有多个 ‘s’,则删除第一次出现的。
2 I:插入一个字符,命令的格式为:I a1 a2 其中a1表示插入到指定字符前面,a2表示将要插入的字符。例如:I s d 表示在指定字符 ’s’ 的前面插入字符 ‘d’ ,若原串中有多个 ‘s’,则插入在最后一个字符的前面。
3 R:替换一个字符,命令格式为:R a1 a2 其中a1为被替换的字符,a2为替换的字符,若在原串中有多个a1则应全部替换。
在编辑过程中,若出现被改的字符不存在时,则给出提示信息。

样例解释

命令为删去s,第一个在字符中出现的s在This中,即得到结果。

输入
输入共两行,第一行为原串(以’.’结束)(长度< =40个字符),第二行为命令(输入方式参见“问题描述” 。

输出
输出共一行,为修改后的字符串或输出指定字符不存在的提示信息。

样例输入

This is a book. 
D  s 

样例输出

Thi is a book.

解题思路

首先读入原字符串和代表命令类型的字符,之后以switch对应到相应的操作进行替换/删除/插入即可。

易错点

  1. 第一行原字符串的结尾可以有空格,会影响第二行命令的读入,因此,第二行的第一个字符(命令的类型)需要用while读入,如果读入的是空格或者换行符,则继续读入,直到读入为字母为止;
  2. 第二行命令各个字符之间可能空格不止一个,也需要以while读入,直到读入字母为止。

代码

#include<bits/stdc++.h>
using namespace std;
vector <char> a,b;

int main()
{
    char temp,c1,c2,t;
    int k,i;
    do{ 
        scanf("%c",&temp);
        a.push_back(temp);
    }while (temp!='.');//读入
    do{
        scanf("%c",&temp); 
    }while (temp==' ' || temp=='\n');
    switch (temp){
        case 'D':
                {
                    do{
                        scanf("%c",&c1); 
                    }while (c1==' ');//防止输入的指令空格数目过多,比如样例所给的
                    k = 0;
                    i = 0;
                    while (i!=a.size()){
                        if (a[i]==c1 && k==0)
                            k = 1;//表示以及删除第一次出现的c1字符
                        else
                            printf("%c",a[i]);
                        i++;
                    }
                    break;
                }
        case 'I':
                {
                    scanf(" %c %c",&c1,&c2);
                    k = 0;
                    i = a.size()-1;//最后一个元素的下标
                    do{
                        b.push_back(a[i]);
                        a.pop_back();
                    }while (a[i--]!=c1);
                    a.push_back(c2);//c2加入到c1之前
                    i = 0;
                    while (i!=a.size()){
                        printf("%c",a[i++]);}//输出前面的部分
                    i = b.size()-1;
                    while (i>=0){
                        printf("%c",b[i--]);}//输出后面的部分
                    break;
                }
        case 'R':
                {
                    scanf(" %c %c",&c1,&c2);
                    i = 0;
                    while (i!=a.size()){
                        if (a[i]==c1)
                            printf("%c",c2);
                        else
                            printf("%c",a[i]);
                        i++;
                    }
                    break;
                }
    }
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值