给定长度为N的字符串S, 要构造一个长度为N的字符串T,起初,T是一个空串,随后反复进行下列任意操作。
从S的头部删除一个字符,加到T的尾部
从S的尾部删除一个字符,加到T的尾部
目标是要构造字典序尽可能小的字符串T。
贪心即可,但要注意如果头尾字典序一样的情况时,比较更深一层两个字母的大小,取字典序较小的那一侧,不能任意取一侧,举例,DABABJGJGJBD,若任意取的话,先将尾部的D放入T的尾部,那么下一个加入T尾部的是B,但如果取左侧的D,那么下一次加入T尾部的是A,显然后者所构成的字符串的字典序更小。因此在两侧字母相同的情况下,优先选择更里层字母字典序更小的那一侧
#include <bits\stdc++.h>
using namespace std;
const int MAX_N = 1000;
int N;
char S[MAX_N + 1];
void solve()
{
int head = 0;
int tail = N - 1;
while (head <= tail)
{
bool left = false;
// 如果相等的话,再进行一次循环……直到分出大小
for (int i = 0; head + i <= tail; i++)
{
if (S[head + i] < S[tail - i])
{
left = true;
break;
}
else if(S[head + i] > S[tail - i])
{
left = false;
break;
}
}
if (left)
putchar(S[head++]);
else
putchar(S[tail--]);
}
putchar('\n');
}