/* 程序问题注释开始
-
程序的版权和版本声明部分
-
Copyright © 2020,湖南工程职业技术学院信息工程学院学生
-
文件名称: 蓝桥杯赛题
-
作 者: 李 斌
-
完成日期: 2020 年 04 月 23日
-
对任务及求解方法的描述部分
-
问题描述
给出一个字符串S,然后给出q条指令,分别有4种:
- Append str
表示在S的最后追加一个字符串str。
例:
原字符串:ABCDE
执行 Append FGHIJ 后
字符串变为:ABCDEFGHIJ - Insert x str
表示在位置x处插入一个字符串str。(输入保证0<x<=当前字符串长度)
例:
原字符串:ABCGHIJ
执行 Insert 4 DEF 后
字符串变为:ABCDEFGHIJ - Swap a b c d
表示交换从第a位到第b位的字符串与从第c位到第d位的字符串。(输入保证0<a<b<c<d<=当前字符串长度)
例:
原字符串:ABGHIFCDEJ
执行 Swap 3 5 7 9后
字符串变为:ABCDEFGHIJ - 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 -
程序问题注释结束
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner in=new Scanner(System.in);
//用户请输入原字符串
String str=in.nextLine();
//用户请输入操作字符串次数
int n=Integer.parseInt(in.nextLine());
//存储每次操作字符串
String[] arr=new String[n];
//用户请输入操作字符串
for(int i=0;i<n;i++)
{
//存储操作串
arr[i]=in.nextLine();
}
//循环操作次数
for(int i=0;i<n;i++)
{
//寻找第一个空格下标
int index=arr[i].indexOf(" ");
//存储操作项
String firststr=arr[i].substring(0,index);
//判断操作项是否为Append
if(firststr.equals("Append"))
{
//存储追加字符串
String substring=arr[i].substring(index+1);
//调用追加方法,结果返回给str
str=Append(str,substring);
}
//判断操作项是否为Insert
if(firststr.equals("Insert"))
{
//寻找最后一个空格下标
int lastindex=arr[i].lastIndexOf(" ");
//寻找并存储待插入下标
String str0=arr[i].substring(index+1,lastindex);
int num1=Integer.parseInt(str0);
//存储插入字符串
String substring=arr[i].substring(lastindex+1);
//调用插入方法,结果返回给str
str=Insert(str,num1,substring);
}
//判断操作项是否为Reverse
if(firststr.equals("Reverse"))
{
//寻找最后一个空格下标
int lastindex=arr[i].lastIndexOf(" ");
//寻找并存储待翻转字符串首下标
String str0=arr[i].substring(index+1,lastindex);
int num1=Integer.parseInt(str0);
//寻找并存储待翻转字符串尾下标
str0=arr[i].substring(lastindex+1);
int num2=Integer.parseInt(str0);
//调用反转方法,结果返回给str
str=Reverse(str,num1,num2);
}
//判断操作项是否为Swap
if(firststr.equals("Swap"))
{
//字符串拆解为字符串数组
String[] num=arr[i].split(" ");
//存储第一个交换字符串首下标
int num1=Integer.parseInt(num[1]);
//存储第一个交换字符串尾下标
int num2=Integer.parseInt(num[2]);
//存储第二个交换字符串首下标
int num3=Integer.parseInt(num[3]);
//存储第二个交换字符串尾下标
int num4=Integer.parseInt(num[4]);
//调用交换方法,结果返回给str
str=Swap(str,num1,num2,num3,num4);
}
}
//输出操作完成的字符串
System.out.println(str);
}
//追加方法
public static String Append(String str,String substring)
{
//追加连接操作
str=str+substring;
//返回追加后字符串
return str;
}
//插入方法
public static String Insert(String str,int num1,String substring)
{
//插入前一部分的字符串
String first=str.substring(0,num1-1);
//插入后一部分的字符串
String last=str.substring(num1-1);
//插入连接操作
str=first+substring+last;
//返回插入后字符串
return str;
}
//反转方法
public static String Reverse(String str,int num1,int num2)
{
//反转前一部分的字符串
String first=str.substring(0,num1-1);
//反转后一部分的字符串
String last=str.substring(num2);
//待反转字符串
String substring =str.substring(num1-1, num2);
//反转的字符串
substring=new StringBuffer(substring).reverse().toString();
//反转连接操作
str=first+substring+last;
//返回反转后字符串
return str;
}
//交换方法
public static String Swap(String str,int num1,int num2,int num3,int num4)
{
//交换前一部分的字符串
String first=str.substring(0,num1-1);
//交换后一部分的字符串
String last=str.substring(num4);
//交换中间一部分的字符串
String center=str.substring(num2,num3-1);
//交换第一部分字符串
String substring1 =str.substring(num1-1, num2);
//交换第二部分字符串
String substring2 =str.substring(num3-1, num4);
//交换连接操作
str=first+substring2+center+substring1+last;
//交换反转后字符串
return str;
}
}
运行结果: