Kaygb's wiki

蓝桥算法提高-字符串操作

试题 算法提高 字符串的操作

资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

  给出一个字符串S,然后给出q条指令,分别有4种:

  1. Append str   表示在S的最后追加一个字符串str。   例:   原字符串:ABCDE   执行 Append FGHIJ 后   字符串变为:ABCDEFGHIJ

  2. Insert x str   表示在位置x处插入一个字符串str。(输入保证0<x<=当前字符串长度)   例:   原字符串:ABCGHIJ   执行 Insert 4 DEF 后   字符串变为:ABCDEFGHIJ

  3. Swap a b c d   表示交换从第a位到第b位的字符串与从第c位到第d位的字符串。(输入保证0<a<b<c<d<=当前字符串长度)   例:   原字符串:ABGHIFCDEJ   执行 Swap 3 5 7 9后   字符串变为:ABCDEFGHIJ

  4. Reverse a b   表示将从第a位到第b位的字符串反转。(输入保证0<a<b<=当前字符串长度)   例:   原字符串:ABGFEDCHIJ   执行 Reverse 3 7 后   字符串变为:ABCDEFGHIJ

  最后输出按顺序执行完指令后的字符串。

输入格式

  输入第一行包含字符串S,第二行包含一个整数q,接下来q行分别为q个指令。

输出格式

  输出为1行,为按顺序执行完输入指令后的字符串。

样例输入

My 5 Append Hello Insert 3 dlroW Reverse 3 7 Swap 3 7 8 12 Swap 1 2 3 7

样例输出

HelloMyWorld

样例说明

  原字符串:My   执行 Append Hello 后:MyHello   执行 Insert 3 dlroW 后:MydlroWHello   执行 Reverse 3 7 后:MyWorldHello   执行 Swap 3 7 8 12 后:MyHelloWorld   执行 Swap 1 2 3 7 后:HelloMyWorld

数据规模和约定

  对于30%的数据,q=1;

  对于70%的数据,如有Swap指令,Swap指令中b-a=d-c;

  对于100%的数据,最终字符串长度不大于40000,1<=q<=150

分析

看到题目我的思路是写四个函数,每个函数处理单独的命令,首先通过字符串对比判断当前行需要执行哪个函数,判断处理之后修改原字符串,在结束之后输出。

其中使用的字符串分割函数:

str.substr(0,x);

由于字符串是字符数组,所以可以使用翻转函数:

reverse(str.begin(),str.end());

代码

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
string Appendstr(string str,string str1);
string Insertstr(string str,int x,string str1);
string Swapstr(string str,int a,int b,int c,int d);
string Reversestr(string s,int a,int b);
int main() {
    string str;
    cin >> str;
    int n;
    cin >> n;
    string se;
    for (int i = 0; i < n; ++i) {
        cin >> se;
        if (se == "Append"){
            string str1;
            cin >> str1;
            str = Appendstr(str,str1);

        }
        else if (se == "Insert"){
            int x;
            string str1;
            cin >> x >> str1;
            str = Insertstr(str,x,str1);


        }
        else if (se == "Reverse"){
            int a,b;
            cin >> a >> b ;
            str = Reversestr(str,a,b);

        }
        else if (se == "Swap"){
            int a,b,c,d;
            cin >> a >> b >> c >> d;
            str = Swapstr(str,a,b,c,d);
        }else {
            cout << "Input Error";
        }
    }
    cout << str;
    return 0;
}

string Appendstr(string str,string str1){
    return str+str1;
}
string Insertstr(string str,int x,string str1){
    x = x-1;
    string a = str.substr(0,x);
    string b = str.substr(x,str.length());
    return a + str1 + b;
}
string Swapstr(string s,int a,int b,int c,int d){
    string str1,str2,str3,str4,str5;
    str1=s.substr(0,a-1);
    str2=s.substr(a-1,b-a+1);
    str3=s.substr(b,c-b-1);
    str4=s.substr(c-1,d-c+1);
    str5=s.substr(d,s.size()-d);
    s=str1+str4+str3+str2+str5;
    return s;
}
string Reversestr(string s,int a,int b){
    string str;
    string str1,str2;
    str1=s.substr(0,a-1);
    str2=s.substr(b,s.size()-b);
    str=s.substr(a-1,b-a+1);
    reverse(str.begin(),str.end());
    s=str1+str+str2;
    return s;
}