代码语言:javascript复制
#include <bits/stdc .h>
using namespace std;
const int MAX_N = 2000;
/*
给定长度为N的字符窜S,要构造一个长度为N的字符串T。起初,T是一个空串,随后反复
进行下列任何操作。
1.从S的头部删除一个字符串,加到T的尾部
2.从S的尾部删除一个字符串,加到T的尾部
目标是要构造字典序尽可能小的字符串T。
限制条件:
1 ≤N ≤2000
字符串S只包含大写英文字母
输入:
N = 6
S = "ACDBCB"
输出:
ABCBCD(如下图所示进行操作)
S="ACDBCB" ==>(开头) S="CDBCB" ==>(末尾) S="CDBC" ==>(末尾) S="CDB"
T="" T="A" T="AB" T="ABC"
==>(末尾) S="CD" ==>(开头) S="D" ==>(开头) S=""
T="ABCB" T="ABCBC" T="ABCBCD"
*/
int n;
char S[MAX_N 1];
void solve()
{
int a = 0, b = n - 1;
while (a <= b)
{
bool left = false;
for (int i = 0; a i <= b; i)
{
if (S[a i] < S[b - i])
{
left = true;
break;
}
else if (S[a i] > S[b - i]) // 如果相等,就进行下一轮循环,往内靠拢继续比较
{// 如果左边小,从开头开始取,反之从末尾开始取
left = false;
break;
}
}
if (left) putchar(S[a ]);
else putchar(S[b--]);
}
}
int main()
{
scanf("%d%*c", &n);
gets(S);
solve();
return 0;
}