让我们每次从头和尾取字母,然后重组成字典序最小的字符串。
解法:贪心。
不断地从开头或结尾取最小的放到新字符串的末位。但是我们还得处理一种开头和末尾相同的情况,我们必须保证尽早取到最小的。所以我们可以用两个指针分别从开头和末尾逐位比较。那边先出现较小的,就先取那边的。
#include<cstdio>
#include<iostream>
using namespace std;
int n, m, ll, rr, sum;
int c[2010], s[2010], l[2010];
bool v1[2010], v2[2010];
int main(){
scanf("%d", &n);
getchar();
for (int i = 0; i < n; i++){
c[i] = getchar();
getchar();
}
ll = 0;
rr = n - 1;
while(ll <= rr){
bool v = 0;
for (int i = 0; ll + i <= rr; i++){
if (c[ll + i] < c[rr - i]){
v = 1;
break;
} else if(c[ll + i] > c[rr - i]){
v = 0;
break;
}
}
if (v) putchar(c[ll++]); else putchar(c[rr--]); sum++;
if (sum % 80 == 0) printf("\n");
}
return 0;
}