题目描述
你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第 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;
}