P5734 【深基6.例6】文字处理软件

题目描述

你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第 0 0 0 个字符。需要支持以下操作:

  • 1 str:后接插入,在文档后面插入字符串 str \texttt{str} str,并输出文档的字符串。

  • 2 a b:截取文档部分,只保留文档中从第 a a a 个字符起 b b b 个字符,并输出文档的字符串。

  • 3 a str:插入片段,在文档中第 a a a 个字符前面插入字符串 str \texttt{str} str,并输出文档的字符串。

  • 4 str:查找子串,查找字符串 str \texttt{str} str 在文档中最先的位置并输出;如果找不到输出 − 1 -1 −1。

为了简化问题,规定初始的文档和每次操作中的 str \texttt{str} str 都不含有空格或换行。最多会有 q q q 次操作。

输入格式

第一行输入一个正整数 q q q,表示操作次数。

第二行输入一个字符串 str \texttt{str} str,表示最开始的字符串。

第三行开始,往下 q q q 行,每行表示一个操作,操作如题目描述所示。

输出格式

一共输出 n n n 行。

对于每个操作 1 , 2 , 3 1,2,3 1,2,3,根据操作的要求输出一个字符串。

对于操作 4 4 4,根据操作的要求输出一个整数。

样例 #1

样例输入 #1

4
ILove
1 Luogu
2 5 5
3 3 guGugu
4 gu

样例输出 #1

ILoveLuogu
Luogu
LuoguGugugu
3

提示

数据保证, 1 ≤ q ≤ 100 1 \leq q\le 100 1≤q≤100,开始的字符串长度 ≤ 100 \leq 100 ≤100。

1.题目分析

输入一行操作数次数N和初始字符串,后面N行输入操作数及题目要求的输入,

每一次操作数,需要打印一次结果,而不是最后统一打印。

值得一提的是,每一次对初始字符串的变动需要同步到字符串本身,意味着可能有些操作需要将初始字符串清空,把结果复制到字符串。

2.题目思路

定义几个数组,分别用于存放初始字符串和临时字符串。写一个循环,循环次数为操作数的次数,每一次键入操作数,嵌套一个switch,根据题目要求对不同的操作数进行相应的输出:

  • 在文档后面插入字符串
  • 保留文档中从第a 个字符起后b个字符
  • 插入片段
  • 查找子串

具体的细节,我在代码里的注释有所提到。值得注意的是,strlen函数是全局变化的,意味着你对数组的长度进行修改将是动态的。

3.代码实现

cpp 复制代码
#include <string.h>
#include <iostream>

using namespace std;


int main() {
    int n, num;
    cin >> n;
    char str[100] = {0};
    char temp[100] = {0};
    char temp1[100] = {0};
    char temp2[100] = {0};
    //输入初始字符串
    cin >> str;
    for (int i = 0; i < n; ++i) {
        //输入操作数
        cin >> num;
        switch (num) {
            case 1:
                //在文档后面插入字符串
                cin >> temp;
                for (int j = 0; j < strlen(temp); ++j) {
                    //strlen函数是全局变化的
                    str[strlen(str)] = temp[j];
                }
                cout << str << endl;
                break;
            case 2:
                //保留文档中从第a 个字符起后b个字符
                int a, b;
                cin >> a;
                cin >> b;
                for (int j = 0; j < b; ++j) {
                    temp1[j] = str[a + j];
                }
                //将原数组清零
                for (int j = 0; j < 100; ++j) {
                    str[j] = 0;
                }
                //重新赋值
                for (int j = 0; j < strlen(temp1); ++j) {
                    str[j] = temp1[j];
                }
                cout << str << endl;
                break;
            case 3:
                //插入片段
                int x;
                cin >> x;
                cin >> temp2;
                for (int j = 0; j < strlen(temp2); ++j) {
                    //需要从插入的每一个字符
                    char c = temp2[j];
                    for (int k = strlen(str) - 1; k >= x + j; k--) {
                        //当前插入位置的后面所有元素往后移动一位
                        str[k + 1] = str[k];
                    }
                    //插入到指定位置
                    str[x + j] = c;
                }
                cout << str << endl;
                break;
            case 4:
                //查找子串
                int index;
                char son[100];
                cin >> son;
                //定义一个标记变量 存在字串为1,不存在为0
                int flag;
                for (int j = 0; j < strlen(str); ++j) {
                    flag = 1;
                    for (int k = 0; k < strlen(son); ++k) {
                        //字串和原字符串的子集进行比较
                        if (str[j + k] != son[k]) {
                            flag = 0;
                        }
                    }
                    if (flag == 1) {
                        //如果相同,打印当前当前索引,并跳出循环
                        index = j;
                        cout << index << endl;
                        break;
                    }
                }
                if (flag == 0) {
                    //不同则打印-1
                    cout << -1 << endl;
                }
                break;
            default:
                break;
        }
    }

    return 0;
}
相关推荐
float_com3 分钟前
【STL】stack,deque,queue 基础,应用与操作
c++·stl·极速入门
学习使我变快乐11 分钟前
C++:用类实现链表,队列,栈
开发语言·c++·链表
lmy_t17 分钟前
C++之第十二课
开发语言·c++
马剑威(威哥爱编程)21 分钟前
除了递归算法,要如何优化实现文件搜索功能
java·开发语言·算法·递归算法·威哥爱编程·memoization
算法萌新——142 分钟前
洛谷P2240——贪心算法
算法·贪心算法
湖北二师的咸鱼43 分钟前
专题:二叉树递归遍历
算法·深度优先
tyler-泰勒44 分钟前
初始c++:入门基础(完结)
java·开发语言·c++
重生之我要进大厂1 小时前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
Happy鱿鱼2 小时前
C语言-数据结构 有向图拓扑排序TopologicalSort(邻接表存储)
c语言·开发语言·数据结构
KBDYD10102 小时前
C语言--结构体变量和数组的定义、初始化、赋值
c语言·开发语言·数据结构·算法