1 solutions
-
0
贪心,如果当前栈顶字符小于未入栈的字符中最小字符,则出栈,否则入栈,可以预处理未入栈最小字符。
#include <bits/stdc++.h> using namespace std; char a[100005];//入栈序列 char b[100005];//b[i]表示从第n-1个字符到第i个字符中最小的那个 char ans[100005];//答案(出栈队列) char zhan[100005];//栈 int n; int main() { cin >> n; scanf("%s", &a); char mc = 'z'; //预处理b数组 for (int i = n - 1; i >= 0; i--) { if (a[i] <= mc) { mc = a[i]; } b[i] = mc; } int ansp = 0; //答案指针 int zhanp = 0; //栈指针 for (int i = 0; i < n; i++) {//枚举每一个字符 //栈非空且栈顶小于未入栈的最小字符 while(zhanp != 0 && zhan[zhanp] <= b[i]) { ans[ansp] = zhan[zhanp];//出栈 zhanp--; ansp++; } if (a[i] == b[i]) {//如果当前字符等于未入栈字符最小值 ans[ansp] = a[i];//入栈再出栈 ansp++; } else {//否则 zhanp++;//入栈 zhan[zhanp] = a[i]; } } while (zhanp != 0) {//栈非空,出栈 ans[ansp] = zhan[zhanp]; zhanp--; ansp++; } printf("%s", ans); return 0; }
Information
- ID
- 677
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- (None)
- # Submissions
- 48
- Accepted
- 4
- Uploaded By