题目描述
给定一个长度为𝑛n的、仅由小写字母组成的字符串,将其按序依次放入栈中。
请问在所有可能的出栈序列中,字典序最小的出栈序列是多少?
输入格式
输入第一行, 一个正整数𝑛n
输入第二行,一个长度为𝑛n的字符串
输出格式
输出所有出栈序列中,字典序最小的出栈序列
数据范围
- 对于30%30%的数据,1≤𝑛≤101≤n≤10
- 对于60%60%的数据,1≤𝑛≤1031≤n≤103
- 对于100%100%的数据,1≤𝑛≤1051≤n≤105
样例数据
输入:
3
yes
输出:
esy
说明:
字符y、e、s依次进栈,所有出栈的可能性有:
{yes}、{yse}、{eys}、{esy}、{sey}
其中 {esy} 的字典序最小
详见代码:
#include <bits/stdc++.h>
using namespace std;
string a;
char b[100005];
string ans = "";
stack<char> s;
int n;
int main()
{
cin >> n;
cin >> a;
b[n]='z';
for (int i = n - 1; i >= 0; i--)
{
b[i] = min(b[i+1],a[i]);
}
for (int i = 0; i < n; i++) {
while(!s.empty() && s.top() <= b[i])
{
ans += s.top();
s.pop();
}
if (a[i] == b[i])
{
ans += a[i];
}
else
{
s.push(a[i]);
}
}
while (!s.empty())
{
ans += s.top();
s.pop();
}
cout << ans;
return 0;
}