分析题目可知我们要最小化字典序顺序,但是我们只能将某个字母删除并将它变为更大的字母,也就是说我们不能通过删除某个字母来达到全化为0的目的,我们只能将每一个字符串中所有小的字母尽可能地往前提。
但问题来了,我们可能要删除掉一些字母我们如何来判断哪一些字母应该被保存呢?
答案就是在这个字符串中,如果在他之后有比他小的字母,那么他一定需要被删除并保存到后面去,那么这是什么?
一个单调栈。
#include <bits/stdc++.h>
using namespace std;
string s;
stack<char>s1;
vector<char>res, ans;
int main() {
int t;
cin >> t;
while (t--) {
res.clear();
ans.clear();
cin >> s;
int len = s.size();
for (int i = 0; i < len; i++)
{
while (!s1.empty() && s1.top() > s[i]) {
res.push_back(min(s1.top() + 1, 57));
s1.pop();
}
s1.push(s[i]);
}
while (!s1.empty()) {
ans.push_back(s1.top());
s1.pop();
}
sort(res.begin(), res.end());
int pos = 0;
for (int i = ans.size() - 1; i >= 0; i--) {
cout << ans[i];
while (pos < res.size() && res[pos] >= ans[i] && res[pos] <= ans[i - 1] && i > 0)
cout << res[pos++];
}
for (int i = pos; i < res.size(); i++) {
cout << res[i];
}
cout << "\n";
}
return 0;
}