题目: 给定长度为N的字符串S,要构造一个长度为N的字符串T。起初,T是一个空串,随后反复进行下列任意操作。
·从S的头部删除一个字符,加到T的尾部
·从S的尾部删除一个字符,加到T的尾部
目标是要构造字典序尽可能小的字符串T。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include "iostream" 2 #include "cstring" 3 #include "vector" 4 5 using namespace std; 6 #define MAX_N 1000 7 8 void solve(int N,char *S) { 9 int a = 0, b = N - 1; 10 while (a<=b) { 11 bool left = false; 12 /* 13 1:当出现相同字母出现要判断内层最小字符所以需要嵌套循环 14 */ 15 for (int i = 0; a + i <= b;i++) { 16 if (S[a+i]<S[b-i]) { 17 left = true; 18 break; 19 } 20 else if (S[a+i]>S[b-i]) { 21 left = false; 22 break; 23 } 24 } 25 //a,b的坐标已经发生位移 26 if (left) putchar(S[a++]); 27 else putchar(S[b--]); 28 } 29 putchar('\n'); 30 } 31 32 int main() { 33 int N; 34 char S[MAX_N+1]; 35 cin >> N >> S; 36 solve(N,S); 37 system("pause"); 38 }
- 里面的一层循环,内层数据判断大小选择左右方向输出。(值得在以后代码中借鉴,写的很简练!)