【问题描述】
输入一个字符串s,以及两个整数i,j,其中0<i <j < s.length, 将i到j中间的字符串切除(不包括i,j),得到两个子串,两个子串进行字符串排序,按字典序
输出为两行,按字典序输出的两个字符串
【输入形式】
第一行输入字符串s,长度不超过10000
第二行输入两个整数i, j,空格分割
【输出形式】
第一行输出排序后,字典序靠前的一个子串
第二行输出排序后,字典序靠后的另一个子串
【样例输入】
WorldFinal
3 5
【样例输出】
Final
Worl
【样例说明】
由3、5对应的(不含两端)的子串为"d", 切除后得到两个子串,分别为"Worl"和"Final",按字典序排序为: "Final"、"Worl",因此先输出前者,再输出后者
本题我们需先分离出i之前j之后的两段字符串,再按照ACIIC表进行比较输出,由于本题没有说明相同的情况(即aannaa,2 5),就默认先输出prior。在比较过程中需注意ACIIC越小的先输出,表如下:
![](https://img-blog.csdnimg.cn/img_convert/2b662217b9a450752275e06fbc8e6a90.jpeg)
本题并不复杂,但比较过程较繁琐,我的代码少许冗长,请自行优化处理。完整代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
int i=0,j=0;
cin>>str;
int size=str.size();
cin>>i>>j;
string prior,later;//分别表示i之前的,j之后的
for(int x=0;x<=i;x++)
{
prior=prior+str[x];
}
int size1=prior.size();
for(int y=j;y<size;y++)
{
later=later+str[y];
}
int size2=later.size();
if(size1>size2)
{
for(int j=0;j<size1;j++)
{
if(prior[j]<later[j])
{
cout<<prior<<endl;
cout<<later<<endl;
break;
}
if(prior[j]>later[j])
{
cout<<later<<endl;
cout<<prior<<endl;
break;
}
if(prior[j]==later[j])
{
continue;
}
}
}
if(size1<size2)
{
for(int j=0;j<size2;j++)
{
if(prior[j]<later[j])
{
cout<<prior<<endl;
cout<<later<<endl;
break;
}
if(prior[j]>later[j])
{
cout<<later<<endl;
cout<<prior<<endl;
break;
}
if(prior[j]==later[j])
{
continue;
}
}
}
if(size1==size2)
{
for(int j=0;j<size1;j++)
{
if(prior[j]<later[j])
{
cout<<prior<<endl;
cout<<later<<endl;
break;
}
if(prior[j]>later[j])
{
cout<<later<<endl;
cout<<prior<<endl;
break;
}
cout<<prior<<endl;
cout<<later<<endl;
break;
}
}
return 0;
}