| 语言 | 时间限制 | 内存限制 | 代码长度限制 | 栈限制 |
|---|---|---|---|---|
| Java (javac) | 500 ms | 512 MB | 16KB | 8192 KB |
| Python (python3) | 400 ms | 256 MB | 16KB | 8192 KB |
| 其他编译器 | 400 ms | 64 MB | 16KB | 8192 KB |
题目描述:
众所周知,随着基于大语言模型(LLM)的人工智能的大规模普及,现在越来越多的系统拥有了人工智能模块(当然,拼题 A 也有)。为了响应潮流,龙龙打算也做一个智慧文本编辑器,但因为大语言模型的 API 太贵了,龙龙打算让这个编辑器的"智慧"停留在名字上就好了。但功能还是得写的,具体来说,对于当前正在编辑的文档,这个编辑器应当支持以下三个功能:
- 查找指定字符串 s 1 s_1 s1 前 3 3 3 次出现的位置;
- 在指定位置 p p p 插入一个指定字符串 s 2 s_2 s2
- 将某一段连续的字符串翻转。
真的文本编辑器可太复杂了,这里我们只简单化考虑由大小写英文字母和数字组成的字符串。
声明:本题仅限人类解答。
输入格式:
输入第一行是一个整数 N ( 1 ≤ N ≤ 50 ) N (1 \le N \le 50) N(1≤N≤50),表示操作的数量。
第二行是一个字符串 S ( 1 ≤ ∣ S ∣ ≤ 10 3 ) S (1 \le ∣S∣ \le10^3) S(1≤∣S∣≤103),表示待操作的初始字符串。
接下来的 N N N 行,每行给出一条操作指令。根据操作种类,分别为以下格式:
1 s1:对应查找操作,查找字符串 s 1 s_1 s1 在当前字符串 T T T 中前 3 3 3 次出现的位置。2 p s2:对应插入操作,将字符串 s 2 s_2 s2 插入到当前字符串 T T T 中"下标为 p p p 的字符"之前。当 p = ∣ T ∣ p=∣T∣ p=∣T∣ 时,表示插入到字符串末尾。3 l r:对应翻转操作,将当前字符串 T T T 中下标从 l l l 到 r r r 的连续子串翻转。
字符串下标从 0 0 0 开始。保证所有输入中的字符串都只包含大小写英文字母和数字,且满足: 1 ≤ ∣ s 1 ∣ ≤ 5 , 1 ≤ ∣ s 2 ∣ ≤ 10 1 \le ∣s_1∣ \le 5,1 \le ∣s_2∣ \le 10 1≤∣s1∣≤5,1≤∣s2∣≤10。
对于第二类和第三类操作,保证输入下标合法,即第二类操作满足 0 ≤ p ≤ ∣ T ∣ 0 \le p \le ∣T∣ 0≤p≤∣T∣,第三类操作满足 0 ≤ l ≤ r < ∣ T ∣ 0 \le l \le r <∣T∣ 0≤l≤r<∣T∣。
说明:对于任意字符串 X X X, ∣ X ∣ ∣X∣ ∣X∣ 表示字符串 X X X 的长度。
输出格式:
对于第一类操作,按从小到大的顺序输出查找到的所有位置(即目标字符串的第一个字符在当前字符串中的下标),相邻两个位置之间用 1 1 1 个空格分隔。如果不足 3 3 3 次,就按实际查找到的次数输出;如果一次也没有找到,输出 − 1 -1 −1。
注意:只要位置不同,就算是不同次出现,出现的字符串允许相互重叠。例如 ababa 中出现了 2 2 2 次 aba,位置依次为 0 0 0 和 2 2 2。
对于第二类和第三类操作,输出操作后的结果字符串。
输入样例:
10
ababa
1 a
1 aba
1 aca
2 0 X
2 6 Y
2 3 M
3 2 6
3 4 4
1 aa
3 0 7
输出样例:
0 2 4
0 2
-1
Xababa
XababaY
XabMabaY
XaabaMbY
XaabaMbY
1
YbMabaaX
数据约定:
题目中设置三个单一操作的数据,对应三种不同的操作,三个数据加起来分配不超过 75 75% 75 的分数。
按照指定指令执行不同的操作
- 1: 查找字符串 s 1 s_1 s1 在当前字符串 T T T 中前 3 3 3 次出现的位置。
- 2: 将字符串 s 2 s_2 s2 插入到当前字符串 T T T 中"下标为 p p p 的字符"之前。当 p = ∣ T ∣ p=∣T∣ p=∣T∣ 时,表示插入到字符串末尾。最后输出操作后的结果字符串。
- 3: 将当前字符串 T T T 中下标从 l l l 到 r r r 的连续子串翻转。最后输出操作后的结果字符串。
emmmmmmm
1:模拟
按照每个要求依次模拟即可
-
- 使用嵌套循环依次判断即可。
- 在每次内层循环中依次判断
s[i + j]与t[j]的内容是否相等。- 如果出现了不相等的情况,那么就表示当前以
i开始的子串与字符串 t不相等。 - 如果到最后也没找到不相同的情况,那么就表示当前
字符串t是字符串s从i开始的子串。
- 如果出现了不相等的情况,那么就表示当前以
-
- 依次添加内容到list中即可。
- 首先先将
字符串s中下标为0~k-1的字符全部添加到list中 - 然后再将
字符串t的所有字符全部添加到list中 - 最后再将
字符串s中下标为k-1以后的字符全部添加到list中
-
- 使用for循环依次枚举每个将要反转的内容
java
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Main
{
static void op1(char[] s)
{
char[] t = sc.next().toCharArray();
int n = s.length, m = t.length;
int pos = 0;
for (int i = 0; i < n && i + m <= n; i++) // 枚举字符串s的每一个子串
{
boolean f = true; // 假设当前字符串t是字符串s中以i开始的子串
for (int j = 0; j < m; j++)
{
if (s[i + j] != t[j]) // 出现了两个对应字符出现了不同
{
f = false; // 那么就表示当前字符串t不是字符串s中以i开始的子串
break;
}
}
if (f == true) // 如果当前字符串t是字符串s中以i开始的子串
{
if (pos++ != 0) out.print(" "); // 如果不是第一个内容,就输出一个空格
out.print(i);
}
if (pos == 3) break; // 如果已经找到了三个子串了,就结束循环
}
if (pos == 0) out.print(-1); // 如果没有找到任何子串,就输出-1
out.println();
}
static String op2(char[] s)
{
int k = sc.nextInt();
char[] t = sc.next().toCharArray();
List<Character> list = new ArrayList<>();
for (int i = 0; i < k; i++) list.add(s[i]); // 将字符串s的前k个字符保存到list中
for (char c : t) list.add(c); // 将字符串t的每个字符添加到list中
for (int i = k; i < s.length; i++) list.add(s[i]); // 将字符串s的剩余部分添加到list中
String S = "";
for (char c : list) S += c; // 拼接字符串
out.println(S);
return S;
}
static String op3(char[] s)
{
int l = sc.nextInt(), r = sc.nextInt();
for (; l <= r; l++, r--) // 枚举区间[l, r]
{
// 交换 s[l] 和 s[r] 的内容
char a = s[l];
s[l] = s[r];
s[r] = a;
}
out.println(new String(s));
return new String(s);
}
public static void main(String[] args)
{
int n = sc.nextInt();
String s = sc.next();
while (n-- > 0)
{
int op = sc.nextInt();
if (op == 1) op1(s.toCharArray());
else if (op == 2) s = op2(s.toCharArray());
else s = op3(s.toCharArray());
}
out.flush();
out.close();
}
static Scanner sc = new Scanner(System.in);
static PrintWriter out = new PrintWriter(System.out);
}
2: 利用StringBuilder类库实现
-
- 利用
s.indexOf(t, k)函数查询当前字符串t在字符串s的第k个位置开始第一次出现的位置
- 利用
-
- 利用
s.insert(k, t)函数将字符串t插入字符串s在第k个位置之前
- 利用
-
- 利用
s.substring(l, r)函数获取字符串s的l~r-1之间所有字符串;利用s.reverse()函数将字符串s中所有内容进行翻转
- 利用
java
import java.io.PrintWriter;
import java.util.Scanner;
public class Main
{
static void op1(StringBuilder s)
{
String t = sc.next();
int k = s.indexOf(t, 0);
int pos = 0;
while (k != -1 && pos != 3)
{
if (pos++ != 0) out.print(" ");
out.print(k);
k = s.indexOf(t, k + 1);
}
if (pos == 0) out.print(-1);
out.println();
}
static StringBuilder op2(StringBuilder s)
{
int k = sc.nextInt();
String t = sc.next();
s.insert(k, t);
out.println(s);
return s;
}
static StringBuilder op3(StringBuilder s)
{
int l = sc.nextInt(), r = sc.nextInt();
StringBuilder sb = new StringBuilder(s.substring(l, r + 1));
sb.reverse();
s.replace(l, r + 1, sb.toString());
out.println(s);
return s;
}
public static void main(String[] args)
{
int n = sc.nextInt();
String S = sc.next();
StringBuilder s = new StringBuilder(S);
while (n-- > 0)
{
int op = sc.nextInt();
if (op == 1) op1(s);
else if (op == 2) s = op2(s);
else s = op3(s);
}
out.flush();
out.close();
}
static Scanner sc = new Scanner(System.in);
static PrintWriter out = new PrintWriter(System.out);
}
如果有说错的 或者 不懂的 尽管提 嘻嘻
一起进步!!!